Java中的時區(qū)轉(zhuǎn)換小結(jié)

原文

時間加減

                Date currentDate = new Date(System.currentTimeMillis());
                Calendar cal = Calendar.getInstance();
                cal.setTime(currentDate);
                cal.add(Calendar.DAY_OF_MONTH, -1);//減一天時間
                startTime=outputFormat.format(cal.getTime());

開發(fā)跨地域的程序時癞揉,常需要進(jìn)行時區(qū)轉(zhuǎn)換噪裕,一個設(shè)計(jì)優(yōu)良的系統(tǒng)株婴,也必須考慮對多時區(qū)的支持怎虫。JDK提供了很多方便的機(jī)制和工具暑认,來幫助我們解決時區(qū)轉(zhuǎn)換問題。

解決跨時區(qū)問題的關(guān)鍵在于時間的記錄形式大审。若將時間單純的記錄成“2011-05-14 23:30:00”蘸际,其中蘊(yùn)含的信息并不足以進(jìn)行時區(qū)轉(zhuǎn)換,因?yàn)闊o法獲知這是中國的23點(diǎn)30徒扶,還是美國的23點(diǎn)30粮彤,更不用說復(fù)雜的夏令時問題了。

我們可以使用一個long類型的變量來記錄時間姜骡,該變量的值等于從1970年1月1日 00:00:00 GMT到記錄時間點(diǎn)以來的毫秒數(shù)导坟,其中GMT代表格林威治標(biāo)準(zhǔn)時間,通過這個差值圈澈,可以獲得記錄時間點(diǎn)的格林威治(零時區(qū))時間惫周,進(jìn)而能方便的轉(zhuǎn)換成全世界各時區(qū)的時間。(很多數(shù)據(jù)庫引擎就是如此處理時間類型數(shù)據(jù))

在Java中康栈,有兩個常用方法來獲取以上描述的值:

  1. System.currentTimeMillis()递递,該方法的返回值是從1970年1月1日 00:00:00 GMT至當(dāng)前時間點(diǎn)以來的毫秒數(shù),通常被用來獲取當(dāng)前系統(tǒng)時間啥么;
  2. java.util.Date的getTime()登舞,該方法的返回值是從1970年1月1日 00:00:00 GMT至Date對象所表示的時間點(diǎn)以來的毫秒數(shù),通常被用來獲取特定的時間饥臂。

此外逊躁,我們還需要借助java.util.TimeZone類,來獲取特定的時區(qū)隅熙,JRE安裝目錄下的\lib\zi文件夾列出了所有TimeZoneID稽煤,如:Asia/Shanghai。最后囚戚,使用java.text.SimpleDateFormat類提供的方法進(jìn)行轉(zhuǎn)換酵熙,并格式化輸出。

//1. 將系統(tǒng)當(dāng)前時間轉(zhuǎn)換成美國東部時間  
// America/Los_Angeles 洛杉磯時間
TimeZone timeZoneNY = TimeZone.getTimeZone("America/New_York");
SimpleDateFormat outputFormat = new SimpleDateFormat("EEE MMM d HH:mm:ss Z yyyy", Locale.US);
outputFormat.setTimeZone(timeZoneNY);
Date date = new Date(System.currentTimeMillis());
System.out.println(outputFormat.format(date));
//2. 將一個以字符串形式輸入的北京時間轉(zhuǎn)換成美國東部時間
String inputDate = "2011-05-14 23:30:00";
TimeZone timeZoneSH = TimeZone.getTimeZone("Asia/Shanghai");
TimeZone timeZoneNY = TimeZone.getTimeZone("America/New_York");
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
inputFormat.setTimeZone(timeZoneSH);
Date date = null;
try 
{
    date = inputFormat.parse(inputDate);
} 
catch (ParseException e) 
{
}
        
SimpleDateFormat outputFormat = new SimpleDateFormat("EEE MMM d HH:mm:ss Z yyyy", Locale.US);
outputFormat.setTimeZone(timeZoneSH);
System.out.println("Asia/Shanghai:" + outputFormat.format(date));
outputFormat.setTimeZone(timeZoneNY);
System.out.println("America/New_York:" + outputFormat.format(date));

那么驰坊,夏令時(DST)的問題怎么解決呢匾二?令人高興的是,JDK(or JRE)已自動為我們進(jìn)行了夏令時處理拳芙〔烀辏可以做個試驗(yàn),來驗(yàn)證以上第2段代碼能適用于夏令時轉(zhuǎn)換舟扎。美國在2011年開始和結(jié)束夏令時的時間是:3.13 2AM和11.6 2AM分飞。

  1. 將輸入時間inputDate設(shè)置為"2011-03-13 14:59:59",輸出: Asia/Shanghai:Sun Mar 13 14:59:59 +0800 2011 America/New_York:Sun Mar 13 01:59:59 -0500 2011 此時睹限,美國東部時間還差1秒進(jìn)入夏令時譬猫,與北京時間相差13小時讯檐。
  2. 將輸入時間inputDate設(shè)置為"2011-03-13 15:00:00",輸出: Asia/Shanghai:Sun Mar 13 15:00:00 +0800 2011 America/New_York:Sun Mar 13 03:00:00 -0400 2011 此時染服,美國東部時間剛好進(jìn)入夏令時别洪,與北京時間相差12小時,同時柳刮,所使用的時區(qū)也發(fā)生了變化挖垛。
    結(jié)束夏令時的試驗(yàn)就不再贅述了。
    JDK(or JRE)之所以能自動的進(jìn)行DST處理诚亚,是因?yàn)槠湟褍?nèi)置了各個國家的夏令時政策晕换,并提供Timezone Updater Tool來保持低版本JDK(or JRE)的TimeZone更新,但SUN官方推薦使用JDK(or JRE)的更新來更新TimeZone信息站宗。
    綜上闸准,我們應(yīng)盡量在系統(tǒng)中使用如上描述的long類型變量來記錄時間,借助相應(yīng)的方法梢灭,可方便的格式化為不同時區(qū)的時間進(jìn)行顯示夷家。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市敏释,隨后出現(xiàn)的幾起案子库快,更是在濱河造成了極大的恐慌,老刑警劉巖钥顽,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件义屏,死亡現(xiàn)場離奇詭異,居然都是意外死亡蜂大,警方通過查閱死者的電腦和手機(jī)闽铐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奶浦,“玉大人兄墅,你說我怎么就攤上這事“牟妫” “怎么了隙咸?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長成洗。 經(jīng)常有香客問我五督,道長,這世上最難降的妖魔是什么瓶殃? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任充包,我火速辦了婚禮,結(jié)果婚禮上碌燕,老公的妹妹穿的比我還像新娘误证。我一直安慰自己,他們只是感情好修壕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布愈捅。 她就那樣靜靜地躺著,像睡著了一般慈鸠。 火紅的嫁衣襯著肌膚如雪蓝谨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天青团,我揣著相機(jī)與錄音譬巫,去河邊找鬼。 笑死督笆,一個胖子當(dāng)著我的面吹牛芦昔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播娃肿,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼咕缎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了料扰?” 一聲冷哼從身側(cè)響起凭豪,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晒杈,沒想到半個月后嫂伞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拯钻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年帖努,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片说庭。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡然磷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刊驴,到底是詐尸還是另有隱情姿搜,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布捆憎,位于F島的核電站舅柜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏躲惰。R本人自食惡果不足惜致份,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望础拨。 院中可真熱鬧氮块,春花似錦绍载、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蝠引,卻和暖如春阳谍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背螃概。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工矫夯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吊洼。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓训貌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親旺订。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容