1. 程式人生 > 程式設計 >Java時區轉換及Date類實現原理解析

Java時區轉換及Date類實現原理解析

這篇文章主要介紹了Java時區轉換及Date類實現原理解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

一、時區的說明

地球表面按經線從東到西,被劃成一個個區域,規定相鄰區域的時間相差1小時。在同一區域內的東端和西端的人看到太陽升起的時間最多相差不過1小時。當人們跨過一個區域,就將自己的時鐘校正1小時(向西減1小時,向東加1小時),跨過幾個區域就加或減幾小時,所以同一時刻在不同時區表示的時間是不一樣的。

二、時間的表示

我們平時表示時間時通常是以一個格式化的字串來表示一個時間,例如"2019-11-5 20:05"這個字串表示的是2019年11月5日20點05分。但這裡有一個隱含的前提,時區是自己當前所在的時區,即東八區的人看到這個時間認為是東八區的20:05,而東九區的人會認為是東九區的20:05,實際上這兩個時間相差了一個小時。所以要正確的表示一個特定時刻,還要再加上時區資訊,例如"2019-11-5 20:05 +8:00"這個字串不管哪個時區的人看到都知道表示的是東八區的時間。

三、時間戳

時間戳表示的是一個時間間隔,從0時區來看,表示從"1970-1-1 00:00 +0:00"到現在(2019-11-5 12:05 +0:00)時刻的時間間隔,而從東八區來看錶示從"1970-1-1 08:00 +8:00"到現在(2019-11-5 20:05 +8:00)的時間間隔。

間隔=現在-起點,因為現在和起點都相差了8小時,所以時間間隔是一樣的,同樣的道理,在任意時區中現在這一個時刻的時間戳都是一樣的。

四、Date類和時間戳

java的Date類中實際儲存的是某一個時刻的時間戳,所以同一時刻在任意時區獲取到的Date物件都是一樣的。當使用SimpleDateFormat格式化日期時,預設的會以當前的系統時區來格式化日期,所以同一時刻不同時區的人格式化日期得到的結果才會有時差。

所以以下程式碼,在東八區和東九區得到的輸出相差了一個小時,但它們的Date物件實際上表示了同一個時刻

public class TestDate {
  public static void main(String[] args) {
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date=new Date(1572960924868L);//以時間戳來給定一個特定時刻
    System.out.println(sdf.format(date));
  }
}

五、java中的時區轉換


SimpleDateFormat的物件可以設定時區,這樣同一個Date物件就可以通過SimpleDateFormat來進行時區轉換

  @Test
  public void test2(){
    Date date=new Date(1572960924868L);
    SimpleDateFormat sdf8=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    sdf8.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));//設定時區為東八區
    System.out.println("東八區的時間:"+sdf8.format(date));//輸出格式化日期

    SimpleDateFormat sdf9=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    sdf9.setTimeZone(TimeZone.getTimeZone("GMT+9:00"));//設定時區為東八區
    System.out.println("東九區的時間:"+sdf9.format(date));//輸出格式化日期
  }

輸出的結果如下圖

同一個時刻1572960924868,先轉為Date物件,再通過SimpleDateFormat對時區進行轉換,並格式化成時間字串輸出。

所以在實際的應用中,遇到需要儲存時間的問題時,可以在資料庫中儲存時間對應的時間戳,這樣在資料庫儲存時就不會有時區的問題,而在應用中需要用到時間時,就把這個時間戳轉為Date,再通過SimpleDateFormat轉換成需要的時區的時間。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。