您好,登錄后才能下訂單哦!
小編這次要給大家分享的是java如何實(shí)現(xiàn)時區(qū)轉(zhuǎn)換,文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
一、時區(qū)的基本概念
GMT(Greenwich Mean Time),即格林威治標(biāo)準(zhǔn)時,是東西經(jīng)零度的地方。人們將地球人為的分為24等份,每一等份為一個時區(qū),每時區(qū)橫跨經(jīng)度15度,時間正好為1小時。往西一個時區(qū),則減去一小時;往東一個時區(qū),則加上一小時。中國在東經(jīng)120度上,(東經(jīng)120°-東經(jīng)0°)所得度數(shù)再除以15,即得8。
UTC(Coordinated Universal Time),即世界協(xié)調(diào)時間,是經(jīng)過平均太陽時(以格林威治時間GMT為準(zhǔn))、地軸運(yùn)動修正后的新時標(biāo)以及以「秒」為單位的國際原子時所綜合精算而成的時間,計算過程相當(dāng)嚴(yán)謹(jǐn)精密,因此若以「世界標(biāo)準(zhǔn)時間」的角度來說,UTC比GMT來得更加精準(zhǔn)。UTC的本質(zhì)強(qiáng)調(diào)的是比GMT更為精確的世界時間標(biāo)準(zhǔn),不過對于現(xiàn)行表款來說,GMT與UTC的功能與精確度是沒有差別的。
CST時間卻同時可以代表如下 4 個不同的時區(qū):
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00
可見,CST可以同時表示美國,澳大利亞,中國,古巴四個國家的標(biāo)準(zhǔn)時間。
DST(Daylight Saving Time),夏日節(jié)約時間,指在夏天太陽升起的比較早時,將時鐘撥快一小時,以提早日光的使用,在英國則稱為夏令時間(Summer Time)。
PDT以及PST, PDT 是 Pacific Daylight Time 的縮寫,美國夏季始于每年4月的第1個周日,止于每年10月的最后一個周日。夏令時比正常時間早一小時,與PDT時間相對應(yīng)的是PST , Pacific Standard Time 。 夏時制結(jié)束后就是PST(太平洋標(biāo)準(zhǔn)時間),西八區(qū),與北京時間(東八區(qū))時差-16個小時。
二、java中的時區(qū)
可以用以下code,列出java中的時區(qū)
String ids[] = TimeZone.getAvailableIDs(); for(String id: ids) { System.out.println(id); }
注意:你會發(fā)現(xiàn)在PDT不在該時區(qū)列表里
如果要用PDT,用PST作為時區(qū)可以得到準(zhǔn)確的時間,即使是夏令時
TimeZone timeZone = TimeZone.getTimeZone("PST"); Calendar calendar = new GregorianCalendar(); calendar.set(Calendar.MILLISECOND, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.HOUR, 0); calendar.set(2018, 5, 10);// 輸出 Sun Jun 10 15:00:00 CST 2018 //calendar.set(2018, 2, 10); // 輸出 Sat Mar 10 16:00:00 CST 2018 calendar.setTimeZone(timeZone); System.out.println(calendar.getTime());
如果要獲得某個時區(qū)是否使用了DST,可以用useDaylightTime
boolean isUsingDST = TimeZone.getTimeZone("America/Los_Angeles").useDaylightTime(); System.out.println(isUsingDST);
如果要判斷某個時間在某個時區(qū)是否發(fā)生了DST,可以用
Calendar calendarServer=Calendar.getInstance(); calendarServer.add(Calendar.DATE, 1); boolean isUsingDST = clientTimeZone.inDaylightTime(calendarServer.getTime()); System.out.println(isUsingDST);
獲取當(dāng)前時區(qū)和UTC的偏移量,在當(dāng)前時間5月13日(發(fā)生了DLS)比較getRawOffset() 和getOffset()
TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));//將timezone設(shè)定到發(fā)生夏令時的地區(qū) int rowOffSet = TimeZone.getDefault().getRawOffset(); int offSet = TimeZone.getDefault().getOffset(System.currentTimeMillis()); System.out.println(offSet + " " + offSet/3600000 ); // -7 hours System.out.println(rowOffSet + " " + rowOffSet/3600000); // -8 hours
以下是時區(qū)轉(zhuǎn)化的例子
Date date = new Date(1359641834000L);// 2013-1-31 22:17:14 String dateStr = "2013-3-31 22:17:14"; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getTimeZone("CST"));// CST = GMT - 6(Central Standard Time (USA)而不是北京標(biāo)準(zhǔn)時間) try { // 指該字串以CST來換算,所以實(shí)際時間是2013-1-31 22:17:14 CST(GMT - 6),輸出是以host的時區(qū)(GMT+8)進(jìn)行format,所以加14 Date dateTmp = dateFormat.parse(dateStr); boolean isUsingDST = TimeZone.getTimeZone("CST").inDaylightTime(dateTmp); System.out.println(isUsingDST);// 輸出true,因此減1個小時 System.out.println(dateTmp);//輸出 Fri Feb 01 11:17:14 CST 2013 } catch(ParseException e) { e.printStackTrace(); } String dateStrTmp = dateFormat.format(date);//數(shù)字是絕對時間,如果以host時區(qū)(GMT+8)來format就是22:17,這個數(shù)字以CST/GMT-6時區(qū)來format,就是-14 System.out.println(dateStrTmp);// 輸出 2013-01-31 08:17:14
看完這篇關(guān)于java如何實(shí)現(xiàn)時區(qū)轉(zhuǎn)換的文章,如果覺得文章內(nèi)容寫得不錯的話,可以把它分享出去給更多人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。