其實(shí)我一直都搞不懂Java中的時(shí)區(qū)是怎么計(jì)算的锤躁,后來(lái)看了一下源代碼發(fā)現(xiàn)好簡(jiǎn)單啊涯呻。黍翎。面徽。
當(dāng)我們執(zhí)行new Date()
時(shí),其實(shí)就是把當(dāng)前的unix時(shí)間戳創(chuàng)建為Date對(duì)象匣掸。
和new Date(System.currentMills())
是等效的趟紊。
那unix的時(shí)間其實(shí)可以等同于UTC時(shí)間,所以用這個(gè)方法創(chuàng)建的Date是UTC時(shí)區(qū)碰酝。
但是霎匈,我個(gè)人認(rèn)為Date其實(shí)沒(méi)有時(shí)區(qū)的概念,他只是用來(lái)表示時(shí)間屬性的一種對(duì)象
為什么會(huì)有時(shí)區(qū)呢送爸?因?yàn)閡nix的時(shí)間是UTC(GMT)
的铛嘱,而我們生活的地區(qū)不一定是UTC時(shí)區(qū),假如我們?cè)趤喼迺r(shí)區(qū)(Asia/Shanghai)
袭厂,那其實(shí)是比UTC快8個(gè)小時(shí)(GMT +8)
這個(gè)時(shí)候的Date如果字符串化墨吓,需要變成正確用戶當(dāng)?shù)氐娜掌冢偛荒芏硷@示UTC的時(shí)間對(duì)吧纹磺?(鬧鐘響了帖烘,發(fā)現(xiàn)自己已經(jīng)被辭退了,GG)
所以時(shí)區(qū)就在這里體現(xiàn)橄杨,Date 與 String 互相轉(zhuǎn)化
那么什么時(shí)候會(huì)用到這種轉(zhuǎn)化呢秘症?一般是用在SimpleDateFormat
這里
SimpleDateFormat asiaSDF = new SimpleDateFormat("yyyy-MM-dd-hh");
asiaSDF.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
try {
return asiaSDF.parse(date);
} catch (ParseException e) {
...
}
}
上面的代碼示例代表字符串轉(zhuǎn)日期對(duì)象(String -> Date)
如果不規(guī)定時(shí)區(qū),那么轉(zhuǎn)換后的date和字符串的時(shí)間相同
如果規(guī)定了時(shí)區(qū)式矫,那么轉(zhuǎn)換后的date比字符串的時(shí)間少8個(gè)小時(shí)
(簡(jiǎn)單地理解為date永遠(yuǎn)是utc時(shí)間乡摹,上層應(yīng)用需要確保時(shí)間的正確性)
相反的轉(zhuǎn)換也是類似的,只是輸出的string是date的+8個(gè)小時(shí)
很簡(jiǎn)單吧