一、時(shí)區(qū)的說明
地球表面按經(jīng)線從東到西,被劃成一個(gè)個(gè)區(qū)域,規(guī)定相鄰區(qū)域的時(shí)間相差1小時(shí)。在同一區(qū)域內(nèi)的東端和西端的人看到太陽升起的時(shí)間最多相差不過1小時(shí)。當(dāng)人們跨過一個(gè)區(qū)域,就將自己的時(shí)鐘校正1小時(shí)(向西減1小時(shí),向東加1小時(shí)),跨過幾個(gè)區(qū)域就加或減幾小時(shí) ,所以同一時(shí)刻在不同時(shí)區(qū)表示的時(shí)間是不一樣的。
二、時(shí)間的表示
我們平時(shí)表示時(shí)間時(shí)通常是以一個(gè)格式化的字符串來表示一個(gè)時(shí)間,例如"2019-11-5 20:05"這個(gè)字符串表示的是2019年11月5日20點(diǎn)05分。但這里有一個(gè)隱含的前提,時(shí)區(qū)是自己當(dāng)前所在的時(shí)區(qū),即東八區(qū)的人看到這個(gè)時(shí)間認(rèn)為是東八區(qū)的20:05,而東九區(qū)的人會(huì)認(rèn)為是東九區(qū)的20:05,實(shí)際上這兩個(gè)時(shí)間相差了一個(gè)小時(shí)。所以要正確的表示一個(gè)特定時(shí)刻,還要再加上時(shí)區(qū)信息,例如"2019-11-5 20:05 +8:00"這個(gè)字符串不管哪個(gè)時(shí)區(qū)的人看到都知道表示的是東八區(qū)的時(shí)間。
三、時(shí)間戳
時(shí)間戳表示的是一個(gè)時(shí)間間隔,從0時(shí)區(qū)來看,表示從"1970-1-1 00:00 +0:00"到現(xiàn)在(2019-11-5 12:05 +0:00)時(shí)刻的時(shí)間間隔,而從東八區(qū)來看表示從"1970-1-1 08:00 +8:00"到現(xiàn)在(2019-11-5 20:05 +8:00)的時(shí)間間隔。
間隔=現(xiàn)在-起點(diǎn),因?yàn)楝F(xiàn)在和起點(diǎn)都相差了8小時(shí),所以時(shí)間間隔是一樣的,同樣的道理,在任意時(shí)區(qū)中現(xiàn)在這一個(gè)時(shí)刻的時(shí)間戳都是一樣的。
四、Date類和時(shí)間戳
java的Date類中實(shí)際保存的是某一個(gè)時(shí)刻的時(shí)間戳,所以同一時(shí)刻在任意時(shí)區(qū)獲取到的Date對象都是一樣的。當(dāng)使用SimpleDateFormat格式化日期時(shí),默認(rèn)的會(huì)以當(dāng)前的系統(tǒng)時(shí)區(qū)來格式化日期,所以同一時(shí)刻不同時(shí)區(qū)的人格式化日期得到的結(jié)果才會(huì)有時(shí)差。
所以以下代碼,在東八區(qū)和東九區(qū)得到的輸出相差了一個(gè)小時(shí),但它們的Date對象實(shí)際上表示了同一個(gè)時(shí)刻
public class TestDate { public static void main(String[] args) { SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date=new Date(1572960924868L);//以時(shí)間戳來給定一個(gè)特定時(shí)刻 System.out.println(sdf.format(date)); } }
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。