有關機器時間、UTC時間、本地時間的總結

  • 2019 年 10 月 7 日
  • 筆記

1. 時間的表達方式有兩種,一種是 human time,比如我們所說的年月日等,一種是 machine time,比如我們用 System.currentTimeMillis() 方法獲得的毫秒數。

2. machine time 表示的是從epoch時間(1970年1月1日0時0分0秒)開始到現在已經過了多少時間,注意這裡的時間都是指UTC時間。

3. 對於任意給定的 machine time,都可以通過加上epoch時間,算出該 machine time 對應的UTC時間,即 machine time 和 UTC 時間是一一對應的。

4. 當 machine time 為0時,其對應的UTC時間就是epoch時間。

5. machine time 可以理解為是UTC時間的另一種表現形式,其本質上就是UTC時間。

6. human time 是一種用人類便於理解方式表示 machine time 的方法,當我們看到一個用年月日等表示的 human time 時,它其實是對 machine time 做的一種轉換。

7. 由於機器只能獲取 machine time,所以所有的human time其實都是要先獲取 machine time,再在其基礎上做各種計算得來的。

8. UTC 時間是 human time 時間的一種,所以要想獲取當前時刻的 UTC 時間,也要先獲取 machine time,再按照上述規則計算出來。

9. UTC 時間不受時區影響,對於給定的一個UTC時間,在全球任意地方都表示同一時刻。

10. UTC 時間也可以粗略的理解為時區為0的時間。

11. 由於machine time 和 UTC 時間的關係,machine time 也是不受時區影響的,即用 System.currentTimeMillis() 方法獲取的一個 machine time,在全球的任意地方也都表示同一時刻。

12. human time還有一種形式就是本地時間,或者說是本地時區時間。

13. 本地時間和UTC時間的關係是,本地時間是在UTC時間的基礎上,通過加減一定的時間得來的,加減的具體數值受所在時區影響。

14. 比如,中國所處時區為東8區,想要算中國境內的本地時間的流程是,先獲取 machine time,根據 machine time 算出 UTC 時間,然後再在UTC時間基礎上加8個小時,算出中國境內的本地時間。

15. 由於UTC時間並不適合表示全球所有地區的本地時間(比如,UTC時間的14點在某些地區可能是晚上),所以才有了本地時區時間這個概念。不同時區在同一時刻使用不同的本地時間,本質上是為了方便人們的日常生活。

16. 如果只有一個本地時間,而沒有該時間對應的時區的話,是無法表示時間線上的某一時刻的,所以,在全球不同地區進行時間交換時,要麼用UTC時間,要麼用帶有時區的本地時間。

17. 不管是UTC時間還是本地時區時間,它們都是 human time,即都可以通過一定規則與machine time 相互轉換,區別就是不同的 human time 形式使用不同的轉換規則。

18. 暫時想到這麼多,如果後續還有其他總結,我們再做補充。

19. 完。