JAVA代碼中時區設置


問題:

Java代碼返回的DateTime時間和單獨截取時間不一致。

 

DateTime設置方法:

DateTimeFormatter format = DateTimeFormat.forPattern("yyyyMMdd");//.withZone(DateTimeZone.forOffsetHours(0));      
        DateTime startDate = DateTime.parse("20200101", format);    
         log.debug("shuqu:{}",startDate.getZone());
        DateTime endDt = startDate.plusMonths(1).minusSeconds(1);

無論從數據庫還是參數設置,時間都在原來的基礎上GMT+8.

例如原格式為:2019-12-25 10:00:00  ,返回格式如圖圈:

 

 

 

問題排查:

1. 數據庫中插入一條數據,創建時間 now() 和當前系統時間相同

2. 通過Java不經過任何時間函數,數據庫中獲取一條數據,時間和數據庫中相同

3. 代碼逐步調試,joda.time.DateTimeFormat會自動加上時區, 這個時區可能有JVM或者當前系統時區決定

4. 修改本機系統的時區即右下角時鍾時區(非GMT+8),joda.time.DateTimeFormat依舊會加上當前時區(GMT+8)。

5. 修改eclise的jre時區,重啟調試。在你的eclipse/MyEclipse的JVM的jre運行參數中設置時區。在Default VM Arguments中設置:-Duser.timezone=GMT+2, joda.time.DateTimeFormat顯示當前時區(GMT+2)

 

結論:

Java中時區由JVM時區決定,為了不影響參數和從DB中取到的時間,在DateTimeFormatter format = DateTimeFormat.forPattern("yyyyMMdd").withZone(DateTimeZone.forOffsetHours(0));      加上時區設置,時區0.

 

 

jvm在讀取linux的系統時區時:

如果存在環境變量TZ,則jvm最優先讀取環境變量TZ中的內容;

如果不存在環境變量TZ,會讀取/etc/sysconfig/clock文件中的ZONE內容(需要引號);

若都不存在,則讀取使用/etc/localtime文件內容所對應的時區。

如果設置了-Duser.timezone,則使用指定的時區;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM