在開發過程中,經常碰到時區問題,一般解決思路,數據庫時區問題,
服務器時區,還有就是數據返回出去的時候(例如spring jackson )
在這幾個解決思路中,有些是要用到Date 和 String 進行轉換的。所以這
我想記錄下SimpleDateFormat平日使用可能會被忽略的知識點
Date 轉 String
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(new Date()));
}
上述代碼很簡單,就是直接當前時間並按照制定格式輸出。
這裏我想應該要明白以下幾個點:
- (1)Date 內部存儲其實是個Long 類型的時間戳,可以通過new Date()源碼發現
//new Date() 相關源碼
private transient long fastTime;
...
public Date(long date) {
fastTime = date;
}
...
public Date() {
this(System.currentTimeMillis());
}
- (2)SimpleDateFormat 在沒有指定TimeZone的情況下,其實是以當前系統的時區的。
測試環境:
上述代碼執行結果:和當前系統時間一致
測試環境:將系統時區改成其它地區的
上述代碼執行結果:和當前系統時間一致
現在代碼裏指定下TimeZone,結果將會按照設定的時區去format。
測試環境:
代碼執行:
- (3)format(Date date) 方法就是把時間戳 按照時區抓成對應格式的時間字符串
String 轉 Date
其實和上面的 Date 轉 String 很類似 , 在沒有指定TimeZone的情況下,採用當前系統的時區;否則按照指定的時區進行轉換。
測試環境:
代碼執行:
所以,parse(String ) 是將 指定TimeZone的時區的字符串 轉成 和當前系統時區一致的 Date 對象。
總結:當SimpleDateFormat 設定了時區的情況下:
轉換 | 結論 |
---|---|
Date => String | Date 裏存儲的時間戳 轉成指定時區下的字符串 |
String => Date | 指定時區下的字符串 轉成當前系統裏的Date |
**時區 對應的 都是字符串 **