SimpleDateFormat的時區記錄

在開發過程中,經常碰到時區問題,一般解決思路,數據庫時區問題,
服務器時區,還有就是數據返回出去的時候(例如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

**時區 對應的 都是字符串 **

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章