日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
關(guān)于Java中的時間處理,你真的了解嗎?

之前在我的知識星球的直面Java板塊中,給粉絲們出了這樣一道題:

成都創(chuàng)新互聯(lián)公司憑借在網(wǎng)站建設(shè)、網(wǎng)站推廣領(lǐng)域領(lǐng)先的技術(shù)能力和多年的行業(yè)經(jīng)驗,為客戶提供超值的營銷型網(wǎng)站建設(shè)服務(wù),我們始終認為:好的營銷型網(wǎng)站就是好的業(yè)務(wù)員。我們已成功為企業(yè)單位、個人等客戶提供了成都網(wǎng)站建設(shè)、成都網(wǎng)站制作服務(wù),以良好的商業(yè)信譽,完善的服務(wù)及深厚的技術(shù)力量處于同行領(lǐng)先地位。

在Java中,如何獲取不同時區(qū)的當前時間?

你知道這道題的正確答案應(yīng)該如何回答嗎?背后的原理又是什么呢?

然后,緊接著,我又提出了以下問題:

為什么以下代碼無法得到美國時間。(在東八區(qū)的計算機上)

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

接下來,本文就圍繞這兩個問題,來帶領(lǐng)讀者一起學習一下哪些和Java中的時間有關(guān)的概念。

時區(qū)

前面提到了時區(qū),可能很多讀者不知道什么是時區(qū),先來簡單介紹一下。

時區(qū)是地球上的區(qū)域使用同一個時間定義。以前,人們通過觀察太陽的位置(時角)決定時間,這就使得不同經(jīng)度的地方的時間有所不同(地方時)。1863年,首次使用時區(qū)的概念。時區(qū)通過設(shè)立一個區(qū)域的標準時間部分地解決了這個問題。

世界各個國家位于地球不同位置上,因此不同國家,特別是東西跨度大的國家日出、日落時間必定有所偏差。這些偏差就是所謂的時差。

為了照顧到各地區(qū)的使用方便,又使其他地方的人容易將本地的時間換算到別的地方時間上去。有關(guān)國際會議決定將地球表面按經(jīng)線從東到西,劃成一個個區(qū)域,并且規(guī)定相鄰區(qū)域的時間相差1小時。在同一區(qū)域內(nèi)的東端和西端的人看到太陽升起的時間最多相差不過1小時。當人們跨過一個區(qū)域,就將自己的時鐘校正1小時(向西減1小時,向東加1小時),跨過幾個區(qū)域就加或減幾小時。這樣使用起來就很方便。

現(xiàn)今全球共分為24個時區(qū)。由于實用上常常1個國家,或1個省份同時跨著2個或更多時區(qū),為了照顧到行政上的方便,常將1個國家或1個省份劃在一起。所以時區(qū)并不嚴格按南北直線來劃分,而是按自然條件來劃分。例如,中國幅員寬廣,差不多跨5個時區(qū),但為了使用方便簡單,實際上在只用東八時區(qū)的標準時即北京時間為準。

格林威治時間

前面提到了,時區(qū)通過設(shè)立一個區(qū)域的標準時間部分地解決了不同地方看到的太陽位置不一樣而無法定義時間的問題。那么這個標準時間是什么呢?

前面還提到。中國位于東八區(qū),一般是用GMT+8來表示東八區(qū)這個時區(qū)。那么,看起來GMT就是這個所謂的標準時間。GMT是個什么東西呢?為什么要在他的基礎(chǔ)上+8來表示東八區(qū)呢?

GMT,是Greenwich Mean Time的縮寫,及格林尼治(格林威治)平時,是指位于英國倫敦郊區(qū)的皇家格林尼治天文臺當?shù)氐钠教枙r,因為本初子午線被定義為通過那里的經(jīng)線。

??

格林威治子午線

自1924年2月5日開始,格林尼治天文臺負責每隔一小時向全世界發(fā)放調(diào)時信息。國際天文學聯(lián)合會于1928年決定,將由格林威治平子夜起算的平太陽時作為世界時,也就是通常所說的格林威治時間

一般使用GMT+8表示中國的時間,是因為中國位于東八區(qū),時間上比格林威治時間快8個小時。

北京時間還可以用CST表示,即China Standard Time,又名中國標準時間,是中國的標準時間。當格林威治時間為凌晨0:00時,中國標準時間正好為上午8:00。

所以,有等式:CST=GMT +8 小時

時間戳

前面提到了全世界各個時區(qū)的時間可能都是不一樣的,那么有沒有一個什么樣的辦法可以不受時區(qū)的限制,可以精確的表示時間呢。

其實是有的,這個方法就是時間戳。

時間戳(timestamp),一個能表示一份數(shù)據(jù)在某個特定時間之前已經(jīng)存在的、 完整的、 可驗證的數(shù)據(jù),通常是一個字符序列,唯一地標識某一刻的時間。

時間戳是指格林威治時間1970年01月01日00時00分00秒起至現(xiàn)在的總秒數(shù)。

有了時間戳,無論我們深處哪個時區(qū),從格林威治時間1970年01月01日00時00分00秒到現(xiàn)在這一時刻的總秒數(shù)應(yīng)該是一樣的。所以說,時間戳是一份能夠表示一份數(shù)據(jù)在一個特定時間點已經(jīng)存在的完整的可驗證的數(shù)據(jù)。

1970-01-01

不知道大家有沒有注意到一個比較特殊的時間,1970-01-01,相信每一個開發(fā)者對這個時間都并不陌生。一般如果軟件系統(tǒng)中出現(xiàn)這個時間的時候,代表著出現(xiàn)了網(wǎng)絡(luò)故障、線上bug等。

?

微信手機充值Bug

當有些計算機存儲或者傳輸時間戳出錯時,這個時間戳就會取默認值。而在計算機中,默認值通常是 0。

當 Timestamp 為 0,就表示時間(GMT)1970年1月1日0時0分0秒。中國使用北京時間,處于東 8 區(qū),相應(yīng)就是早上 8 點。因此在中國這邊,時間出錯了,就經(jīng)常會顯示成 1970年1月1日 08:00。

System.out.println(new Date(0));
//Thu Jan 01 08:00:00 CST 1970

當我們在Java代碼中使用new Date(0)來創(chuàng)建時間的時候,得到的結(jié)果就是Thu Jan 01 08:00:00 CST 1970,既1970年1月1日 上午08點整。

Date

前面提到了java.util.Java中的Date類,這個類通常用來表示時間。你可以通過getTime()方法訪問java.util.Date實例的日期和時間,比如像這樣:

Date date = new Date();
long time = date.getTime();

以上代碼,其實得到的就是時間戳,在源碼中也有明確的表述:

??

?所以,我們就可以認為java.util.Java其實表示的就是從格林威治1970年1月1日零點到現(xiàn)在這一時刻的總秒數(shù)。

從Date的源碼中也可以看到,Date中是不包含時區(qū)有關(guān)的信息的,因為時間戳和時區(qū)沒有關(guān)系。

那么,如果想要把一個時間戳轉(zhuǎn)換成不同時區(qū)的時間輸出應(yīng)該怎么做呢?

顯示不同時區(qū)的時間

想要把時間戳轉(zhuǎn)換成對應(yīng)時區(qū)的時間,總要有個地方可以獲取時區(qū)吧。其實,我們的計算機中是有時區(qū)相關(guān)的信息的。

無論我們使用的是哪種操作系統(tǒng)的電腦,都是可以查看時間的,而一般情況下,我們拿到的電腦都會展示中國時間,那是因為操作系統(tǒng)中已經(jīng)設(shè)置了一個默認時區(qū)。

其實,Java中的時區(qū)信息也是從操作系統(tǒng)中取到的,默認情況下會使用操作系統(tǒng)的時區(qū)。

當我們使用System.out.println來輸出一個時間的時候,他會調(diào)用Date類的toString方法,而該方法會讀取操作系統(tǒng)的默認時區(qū)來進行時間的轉(zhuǎn)換。

public String toString() {
// "EEE MMM dd HH:mm:ss zzz yyyy";
BaseCalendar.Date date = normalize();
...
}

private final BaseCalendar.Date normalize() {
...
TimeZone tz = TimeZone.getDefaultRef();
if (tz != cdate.getZone()) {
cdate.setZone(tz);
CalendarSystem cal = getCalendarSystem(cdate);
cal.getCalendarDate(fastTime, cdate);
}
return cdate;
}

static TimeZone getDefaultRef() {
TimeZone defaultZone = defaultTimeZone;
if (defaultZone == null) {
// Need to initialize the default time zone.
defaultZone = setDefaultZone();
assert defaultZone != null;
}
// Don't clone here.
return defaultZone;
}

主要代碼如上。也就是說如果我們想要通過System.out.println輸出一個Date類的時候,輸出美國洛杉磯時間的話,就需要想辦法把defaultTimeZone改為America/Los_Angeles,這個方法就是:

TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));

所以,當我們想要輸出美國洛杉磯時間時,可以選擇這種方式:

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

還有一種方式,就是通過SimpleDateFormat來處理,這種方式我們在為什么阿里巴巴禁止把SimpleDateFormat定義為static類型的中也介紹過。這里就不再展開了。

接下來,我們再回到文章開始的那個問題:

為什么以下代碼無法得到美國時間。(在東八區(qū)的計算機上)

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

其實答案前面也已經(jīng)說過了,我們通過查看Date.toString的源碼,發(fā)現(xiàn)在輸出的過程中該方法只會去獲取系統(tǒng)的默認時區(qū),只有修改了默認時區(qū)才會顯示該時區(qū)的時間。

但是,通過閱讀Calendar的源碼,我們可以發(fā)現(xiàn),getInstance方法雖然有一個參數(shù)可以傳入時區(qū),但是并沒有將默認時區(qū)設(shè)置成傳入的時區(qū)。

而在Calendar.getInstance.getTime后得到的時間只是一個時間戳,其中未保留任何和時區(qū)有關(guān)的信息,所以,在輸出時,還是顯示的是當前系統(tǒng)默認時區(qū)的時間。

Java 8與時區(qū)

了解Java8 的朋友可能都知道,Java8提供了一套新的時間處理API,這套API比以前的時間處理API要友好的多。

Java8 中加入了對時區(qū)的支持,帶時區(qū)的時間為分別為:ZonedDate、ZonedTime、ZonedDateTime。其中每個時區(qū)都對應(yīng)著 ID,地區(qū)ID都為 “{區(qū)域}/{城市}”的格式,如Asia/Shanghai、America/Los_Angeles等。

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

總結(jié)

世界上有很多時區(qū),不同的時區(qū)的時間不一樣,中國使用東八區(qū)的時間作為標準時間。美國自東海岸至西海岸橫跨西五區(qū)至西十區(qū),共六個時區(qū)。

所謂東八區(qū),一般表示成GMT+8,這里的GMT指的是格林威治時間。計算機中經(jīng)常使用時間戳來表示時間,時間戳指的就是當前時間舉例格林威治的1970-01-01 00:00:00的總秒數(shù)。

而Java中的Date類中是不包含時區(qū)信息的,在使用System.out.println打印Date的時候,回調(diào)用Date.toString方法,該方法會獲取系統(tǒng)的默認時區(qū)來轉(zhuǎn)換時間。

在Java8中可以使用ZonedTime、ZonedDate和ZonedDateTime來表示帶有時區(qū)信息的時間。

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

拓展知識

什么是冬令時?什么是夏令時?

夏令時、冬令時的出現(xiàn),是為了充分利用夏天的日照,所以時鐘要往前撥快一小時,冬天再把表往回撥一小時。其中夏令時從3月第二個周日持續(xù)到11月第一個周日。

冬令時:北京和洛杉磯時差16小時,北京和紐約時差13小時。 夏令時:北京和洛杉磯時差15小時,北京和紐約時差15小時。

CET,UTC,GMT,CST幾種常見時間的含義和關(guān)系?

CET,歐洲中部時間(英語:Central European Time,CET)是比世界標準時間(UTC)早一個小時的時區(qū)名稱之一。

UTC,協(xié)調(diào)世界時,又稱世界標準時間或世界協(xié)調(diào)時間,簡稱UTC。

GMT,格林尼治標準時間,是指位于英國倫敦郊區(qū)的皇家格林尼治天文臺的標準時間,因為本初子午線被定義在通過那里的經(jīng)線。

CST,北京時間,China Standard Time,又名中國標準時間,是中國的標準時間。

CET=UTC/GMT + 1小時、CST=UTC/GMT +8 小時、CST=CET+9 


名稱欄目:關(guān)于Java中的時間處理,你真的了解嗎?
文章分享:http://www.dlmjj.cn/article/cceoojo.html