漫話:如何給女友解釋爲何日本時間比中國時間快一個小時

立刻就要五一勞動節放假了,忙碌了半年,準備趁着假期出去放鬆放鬆,因而開始準備行程。女友據說日本5月份能夠看櫻花,因而她在看去日本的航班。我在旁邊默默的看了下個人信用卡額度。bash

如上圖,飛機13:40從杭州蕭山機場起飛,17:50在東京成田機場降落。可是實際上,飛機整個航行確實只飛行了3小時10分。

由於日本時間比中國時間早一個小時。日本的17:50至關於國內的16:50。飛機實際上只飛了3小時而已。spa

時區

好久之前,在沒有鐘錶的年代,人們經過觀察太陽決定時間,一開始人們根據太陽掛在天空的位置來大體的肯定時間,慢慢的人們根據太陽照射到的物體投下的影子來肯定時間。操作系統

如古代人們使用的日晷,就是人類古代利用日影測得時刻的一種計時儀器。3d

在一天中,被太陽照射到的物體投下的影子在不斷地改變着:

第一是影子的長短在改變。早晨的影子最長,隨着時間的推移,影子逐漸變短,一過中午它又從新變長;指針

第二是影子的方向在改變。在北迴歸線以北的地方,早晨的影子在西方,中午的影子在北方,傍晚的影子在東方。從原理上來講,根據影子的長度或方向均可以計時,但根據影子的方向來計時更方便一些。故一般都是以影子的方位計時。code

隨着時間的推移,晷針上的影子慢慢地由西向東移動。移動着的晷針影子好像是現代鐘錶的指針,晷面則是鐘錶的表面,以此來顯示時刻。cdn

可是,因爲地球的自轉,這就使得不一樣經度的地方的時間有所不一樣(地方時)。東邊的地點比西邊的地點先看到日出,東邊地點的時刻較早,西邊地點的時刻較晚。對象

世界各個國家位於地球不一樣位置上,所以不一樣國家,特別是東西跨度大的國家日出、日落時間一定有所誤差。這些誤差就是所謂的時差。blog

爲了照顧到各地區的使用方便,又使其餘地方的人容易將本地的時間換算到別的地方時間上去,1863年,人們首次提出了時區的概念。get

有關國際會議決定將地球表面按經線從東到西,劃成一個個區域,而且規定相鄰區域的時間相差1小時。

在同一區域內的東端和西端的人看到太陽升起的時間最多相差不過1小時。當人們跨過一個區域,就將本身的時鐘校訂1小時(向西減1小時,向東加1小時),跨過幾個區域就加或減幾小時。

就像咱們若是去日本旅遊,咱們的手錶時間顯示的是中國時間,爲了適應當地的時間,就須要將其校訂一個小時。

現今全球共分爲24個時區。

格林威治時間

咱們說中國在時區上是東八區,通常用GMT+8來表示,日本是東九區,通常用GMT+9來表示。

其實就是說中國時間是在GMT時間的基礎上加8個小時,而日本時間是在GMT時間的基礎上加9個小時。因此日本時間會比中國時間快一個小時。

那麼到底什麼是GMT呢?

GMT是Greenwich Mean Time的縮寫,即格林威治時間(格林尼治平時),是指位於英國倫敦郊區的皇家格林尼治天文臺當地的平太陽時,由於本初子午線被定義爲經過那裏的經線。

自1924年2月5日開始,格林尼治天文臺負責每隔一小時向全世界發放調時信息。國際天文學聯合會於1928年決定,將由格林威治平子夜起算的平太陽時做爲世界時,也就是一般所說的格林威治時間。

因爲地理位置不一樣,中國和日本分屬於不一樣的時區,採用的時間標準也就不一樣。而規定中相鄰的時區中時間間隔是1小時,又因爲中國屬於東八區,日本屬於東九區,因此中國時間是GTM+8,日本時間是GMT+9,因此,日本時間比中國時間快一個小時。


理論時區與法定時區

理論時區以被15整除的子午線爲中心,向東西兩側延伸7.5度,即每15°劃分一個時區,這是理論時區。

理論時區的時間採用其中央經線(或標準經線)的地方時。因此每差一個時區,區時相差一個小時,相差多少個時區,就相差多少個小時。東邊的時區時間比西邊的時區時間早。

可是,各個國家和地區具體採用哪一個時區實際上是本身能夠決定的,理論時區只是建議性的。爲了避開國界線,有的時區的形狀並不規則,並且比較大的國家以國家內部行政分界線爲時區界線,這是實際時區,即法定時區

例如,中國幅員寬廣,在理論時區上,差很少跨5個時區,包括東五區、東六區、東七區、東八區以及東九區。若是嚴格按照地理劃分的話,那麼烏魯木齊的時間可能和黑龍江的時間相差四個小時。

可是,爲了方便管理和使用,中國的法定時區以東八時區的標準時即北京時間爲準。因此,中國時間俗稱北京時間。

好處天然不言而喻,你們統一使用同一個時間,就是比較方便。缺點也比較明顯,就是一樣是早上四點,有的地區天已經亮了,可是有些地方仍是黑的。

雖然本文介紹的中國和日本這兩個國家都是使用惟一法定時區的。可是,仍是有不少國家並非使用統一的時區的。

如美國各州的時區,基本上按地理位置,也就是經度區分的,也許美國是執行的最標準者之一。

戰鬥民族俄羅斯的時區也並不統一,好比處在幾乎差很少爲止的葉卡捷琳堡和鄂木斯克就執行了兩個時區。這種狀況大多數和歷史有關。

代碼中獲取不一樣時區的時間


Java中使用TimeZone 表示時區偏移量。TimeZone對象給咱們的是原始的偏移量,也就是與GMT相差的微秒數,即TimeZone表示時區偏移量,本質上以毫秒數保存與GMT的差值。

獲取TimeZone能夠經過時區ID,如"America/New_York",也能夠經過GMT+/-hh:mm來設定。例如北京時間能夠表示爲GMT+8:00。

當咱們想要輸出美國洛杉磯時間時,能夠選擇這種方式:

TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
Date date = new Date();
System.out.println(date);
複製代碼

須要注意的是,如下代碼是沒法得到美國洛杉磯時間的:

System.out.println(Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles")).getTime());
複製代碼

由於當咱們使用System.out.println來輸出一個時間的時候,他會調用Date類的toString方法,而該方法會讀取操做系統的默認時區來進行時間的轉換。只有修改了默認時區纔會顯示該時區的時間。

可是,經過閱讀Calendar的源碼,咱們能夠發現,getInstance方法雖然有一個參數能夠傳入時區,可是並無將默認時區設置成傳入的時區。

而在Calendar.getInstance.getTime後獲得的時間只是一個時間戳,其中未保留任何和時區有關的信息,因此,在輸出時,仍是顯示的是當前系統默認時區的時間。

Java8提供了一套新的時間處理API,這套API比之前的時間處理API要友好的多。

Java8 中加入了對時區的支持,帶時區的時間爲分別爲:ZonedDate、ZonedTime、ZonedDateTime。其中每一個時區都對應着 ID,地區ID都爲 「{區域}/{城市}」的格式,如Asia/Shanghai、America/Los_Angeles等。

在Java8中,直接使用如下代碼便可輸出美國洛杉磯的時間:

LocalDateTime now = LocalDateTime.now(ZoneId.of("America/Los_Angeles"));
System.out.println(now);
複製代碼

相關文章
相關標籤/搜索