1. 程式人生 > >JAVA UTC時間和本地時間

JAVA UTC時間和本地時間

UT - 世界時

Universal Time
世界時是最早的時間標準。
在1884年,國際上將1s確定為全年內每日平均長度的1/8.64×104。以此標準形成的時間系統,稱為世界時,即 UT1。
1972年國際上開始使用國際原子時標,從那以後,經過格林威治老天文臺本初子午線的時間便被稱為世界時,即UT2,
或稱格林威治時間(GMT),是對地球轉速週期性差異進行校正後的世界時。

TAI - 國際原子時

international atomic time
1967年第13屆國際度量衡會議上通過一項決議,定義 1s 為銫-133原子基態兩個超精細能級間躍遷輻射9,192,631,770周所持續的時間,這是利用銫原子振盪週期極為規律的特性。
現在用的時間就是1971年10月定義的國際原子時,是通過世界上大約200多臺原子鐘進行對比後,再由國際度量衡局時間所進行資料處理,得出的統一的原子時。

GMT - 格林尼治標準時間,格林威治平均時間

Greenwich Mean Time
由於地球軌道並非圓形,其執行速度又隨著地球與太陽的距離改變而出現變化,因此視太陽時欠缺均勻性。
視太陽日的長度同時亦受到地球自轉軸相對軌道面的傾斜度所影響。
為著要糾正上述的不均勻性,天文學家計算地球非圓形軌跡與極軸傾斜對視太陽時的效應。
平太陽時就是指經修訂後的視太陽時。在格林尼治子午線上的平太陽時稱為世界時(UT0),又叫格林尼治平時(GMT)。

UTC - 協調世界時

Universal Time Coordinated
UTC是國際無線電諮詢委員會制定和推薦的,UTC相當於本初子午線(即經度0度)上的平均太陽時。
它是經過平均太陽時(以格林威治標準時間GMT)、地軸運動修正後的新時標以及以「秒」為單位的國際原子時所綜合精算而成的時間,
計算過程相當嚴謹精密,因此若以「世界標準時間」的角度來說,UTC比GMT來得更加精準。
其誤差值必須保持在0.9秒以內,若大於0.9秒則由位於巴黎的國際地球自轉事務中央局釋出閏秒,使UTC與地球自轉週期一致。
所以基本上UTC的本質強調的是比GMT更為精確的世界時間標準.它其實是個更精確的GMT.

我們一般不需要關注閏秒,java也沒有提供對閏秒的處理方式。
我們通常需要使用時間戳這個概念,當需要處理的邏輯需要跨時區的時候,我們就不得不採用統一的時間方案,轉化為UTC時間。或者直接儲存時間戳。
一般來說:轉化為UTC時間,
由於北京時間是東八區時間,比UTC時間快了8個小時 2018-09-03-10:00:00的北京時間轉化為UTC時間就成了 2018-09-03-02:00:00。這樣就每次同一儲存時間為UTC時間,前端在展示的時候,將時間還原成當前時區的時間。
2、存取時間戳,時間戳是和時區無關的一個概念,同一個時刻,不同的時區的時間戳是一樣的。舉個例子 現在是北京時間 2018-09-03-10:00:00。也就是UTC時間2018-09-03-02:00:00。這個時刻的時間戳是某個值。當用戶所處的時區發生變化的時候,比如使用者從北京去倫敦(UTC時區),此時前端呈現時間的時候,就會因為時區的變化。時間自動變為2018-09-03-02:00:00。而當用戶回到北京的時候,時間又會變成 2018-09-03-10:00:00。這樣時間描述的都是那一刻。

public static void main(String[] args){
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
        System.out.println("UTC時間---》"+calendar.getTime().getTime());
        System.out.println(calendar.get(Calendar.YEAR)+
                "年"+calendar.get(Calendar.MONTH)+
                "月"+calendar.get(Calendar.DATE)+
                "日"+calendar.get(Calendar.HOUR_OF_DAY)+
                "時"+calendar.get(Calendar.MINUTE)+
                "分"+calendar.get(Calendar.SECOND)+"秒");
        calendar.setTimeZone(TimeZone.getTimeZone("GMT+8"));
        System.out.println("北京時間---》"+calendar.getTime().getTime());
        System.out.println(calendar.get(Calendar.YEAR)+
                "年"+calendar.get(Calendar.MONTH)+
                "月"+calendar.get(Calendar.DATE)+
                "日"+calendar.get(Calendar.HOUR_OF_DAY)+
                "時"+calendar.get(Calendar.MINUTE)+
                "分"+calendar.get(Calendar.SECOND)+"秒");
        calendar.setTimeZone(TimeZone.getTimeZone("GMT+6"));
        System.out.println("東六區---》"+calendar.getTime().getTime());
        System.out.println(calendar.get(Calendar.YEAR)+
                "年"+calendar.get(Calendar.MONTH)+
                "月"+calendar.get(Calendar.DATE)+
                "日"+calendar.get(Calendar.HOUR_OF_DAY)+
                "時"+calendar.get(Calendar.MINUTE)+
                "分"+calendar.get(Calendar.SECOND)+"秒");
}


結果為:
UTC時間---》1535980042858
20188313722秒
北京時間---》1535980042858
20188321722秒
東六區---》1535980042858
20188319722