時間戳,時間字符串,時刻,時區究竟都是什麼東西

我上一篇關於時間的博客在這:
https://blog.csdn.net/ql562482472/article/details/81328647

過去了快一年,我發現其實時區這個問題,還挺有意思的。

事情源於前一陣,springboot的mybatis插件更新到了2.x版本,項目中ZonedDateTime突然不能用了,向作者提了問題,作者推薦我使用OffsetDateTime,於是我又仔細研究了下關於時區的問題。

我們一般使用的都是unix時間戳,時間戳表示1970年開始的毫秒值。

我們平時還遇到過時間字符串

  • 有的是這樣:2019-06-25 12:45:46,

  • 有的是這樣:2019-06-25T12:45:46Z,

  • 有的是這樣:2019-06-25T12:45:46+8:00

我們可以看出來,上面4種方式,後兩種字符串帶了“Z”和“+8:00”,這個就是時區信息。

  • 時間戳沒什麼說的,它本質是UTC時間,也就是+0時區,這是一個規範。大家拿它當作本地時區來用的做法,是一種不合規範的行爲,會導致將來接手你代碼的人的誤解。

  • 字符串方式,是有:有時區信息和無時區信息兩種的

      有時區信息:
      
      			轉換成ZonedDateTime:直接轉換
      			
      			轉換成LocalDateTime:手動扔掉時區信息,轉換成無時區信息的時刻
      
      無時區信息:
      
      			轉換成ZonedDateTime:手動指定(自己想一個時區)時區信息後轉換
      			
      			轉換成LocalDateTime:直接轉換
    

現在原始的說完了,說說ZonedDateTime、LocalDateTime:

  • ZonedDateTime:全世界唯一的一個時刻,在北京還是在倫敦,只要是同一個這個對象,那麼按照UTC時區或者+8時區,都將得到同一個時間點,比如2019-06-25T19:20Z等價於2019-06-26T03:20+8在北京時間是2019年06月26日3點20分,在倫敦時間是2019年06月25日19點20分,但他們倆 都表示同一個時刻。
  • LocalDateTime:這個就沒有那麼精確的,比如我獲取到這個對象是2019年6月25日19點20分,但我不知道這個時間的時區,你在倫敦拿到這個對象,可能認爲這是倫敦時間2019年6月25日19點20分,但是我在北京我可能就認爲這是北京時間2019年6月25日19點20分,可能會有歧義

這兩個各有各的運用範圍,大家要自己掂量着用

迴歸最開始,ZonedDateTime不再受支持的問題。

是因爲這個對象存在夏令時問題,不如OffsetDateTime簡單粗暴,夏令時這玩意坑啊 真的不好算。

從建立對象的角度來說ZonedDateTime需要的是ZoneId,OffsetDateTime需要的是ZoneOffset,一個是時區,一個是偏移量,大家應該從這裏也明白一點東西了。

ZoneId的構建一般是ZoneId.of(“Asia/Shanghai”)(也可以"+8")

ZoneOffset的構建一般就是ZoneOffset.ofHours(8)

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