Java對世界不同時(shí)區(qū)timezone之間時(shí)間轉(zhuǎn)換的處理方法
最近出現(xiàn)一個(gè)問題是這樣的:我們的系統(tǒng)在國外打印的日志時(shí)間由于時(shí)差關(guān)系和國內(nèi)不一致,看起來不方便,希望國外的日志和國內(nèi)保持一致,即:需要對不同時(shí)區(qū)的時(shí)間做轉(zhuǎn)換調(diào)整,統(tǒng)一為國內(nèi)時(shí)間。
一、關(guān)于時(shí)區(qū)的一些概念
1.1 什么是時(shí)區(qū)?
timezone,即由于世界各國家與地區(qū)經(jīng)度不同,地方時(shí)也有所不同,按照經(jīng)度將全球劃分為24個(gè)時(shí)區(qū)。
時(shí)區(qū)有相應(yīng)的英文字母縮寫,例如GMT,UTC,CST等,常見的時(shí)區(qū),具體參考:java時(shí)區(qū)理解。
1.2 什么是夏令時(shí)?
通俗易懂的解釋就是:夏令時(shí)開始的時(shí)候,大家在夜里2點(diǎn)把表往前調(diào)一個(gè)小時(shí),即本來兩點(diǎn),被你手動(dòng)調(diào)成了三點(diǎn),如果你七點(diǎn)起床,那你那天晚上就會(huì)少睡一個(gè)小時(shí),為什么這么做是因?yàn)橄奶斓臅r(shí)候7點(diǎn)其實(shí)天已經(jīng)亮了,這樣你到了第二天晚上8點(diǎn)(其實(shí)是之前的7點(diǎn))就應(yīng)該睡覺了,這樣就可以節(jié)省電了,所以夏令時(shí)叫(Daylight Saving Time:DST),這篇文章講了為什么要有夏令時(shí)?什么時(shí)候去修改表的時(shí)間?為什么是晚上2點(diǎn)修改?反對夏令時(shí)?還有人寫paper說夏令時(shí)沒什么用。
二、如何在不同時(shí)區(qū)之間轉(zhuǎn)換時(shí)間
上部分分析了不同時(shí)區(qū),還有夏令時(shí)的區(qū)別,即我們在轉(zhuǎn)換時(shí)區(qū)的時(shí)候要考慮這兩個(gè)問題,基本思路是:
- 獲取到源時(shí)區(qū)相對于GMT的差距(考慮夏令時(shí))。
- 獲取到目的時(shí)區(qū)相對于GMT的差距(考慮夏令時(shí))。
- 用當(dāng)前的時(shí)間 - 源差距 + 目的差距
代碼如下所示:
public class TimeZoneTransform {
private static String dateTransformBetweenTimeZone(Date sourceDate, DateFormat formatter,
TimeZone sourceTimeZone, TimeZone targetTimeZone) {
Long targetTime = sourceDate.getTime() - sourceTimeZone.getRawOffset() + targetTimeZone.getRawOffset();
return getTime(new Date(targetTime), formatter);
}
private static String getTime(Date date, DateFormat formatter) {
return formatter.format(date);
}
private static String getTimeZone() {
Calendar cal = Calendar.getInstance();
// getOffset will access to offset and contains DaylightTime
int timeZone = cal.getTimeZone().getOffset(System.currentTimeMillis()) / (3600000);
if (timeZone >= 0) {
return String.valueOf("+" + timeZone);
}
return String.valueOf(timeZone);
}
public static String getGMTTime(Date date, SimpleDateFormat formatter) {
TimeZone srcTimeZone = TimeZone.getTimeZone("GMT" + getTimeZone());
TimeZone destTimeZone = TimeZone.getTimeZone("GMT+8");
return dateTransformBetweenTimeZone(date, formatter, srcTimeZone, destTimeZone);
}
public static void main(String[] args) {
System.out.println(getGMTTime(new Date(System.currentTimeMillis()), new SimpleDateFormat()));
}
}

三、Java中關(guān)于時(shí)間處理的類
關(guān)于Date,Calendar,LocalDate/LocalTime的介紹文章。
參考資料:
Java時(shí)區(qū)處理之Date,Calendar,TimeZone,SimpleDateFormat
到此這篇關(guān)于Java對世界不同時(shí)區(qū)timezone之間時(shí)間轉(zhuǎn)換的處理方法的文章就介紹到這了,更多相關(guān)Java不同時(shí)區(qū)timezone時(shí)間轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中的instanceof關(guān)鍵字在Android中的用法實(shí)例詳解
instanceof是Java的一個(gè)二元操作符,和==,>,<是同一類東西。接下來通過本文給大家介紹Java中的instanceof關(guān)鍵字在Android中的用法,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-07-07
使用Nacos實(shí)現(xiàn)動(dòng)態(tài)路由的步驟和代碼示例
這篇文章主要介紹了使用 Nacos 實(shí)現(xiàn) Spring Cloud Gateway 的動(dòng)態(tài)路由,本文給大家介紹了具體的實(shí)現(xiàn)步驟和代碼案例,感興趣的小伙伴跟著小編一起來看看吧2024-09-09
Springboot如何同時(shí)裝配兩個(gè)相同類型數(shù)據(jù)庫
這篇文章主要介紹了Springboot如何同時(shí)裝配兩個(gè)相同類型數(shù)據(jù)庫,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
java操作excel導(dǎo)入導(dǎo)出的3種方式
項(xiàng)目需要,要實(shí)現(xiàn)一個(gè)導(dǎo)入導(dǎo)出excel的功能,于是任務(wù)驅(qū)動(dòng)著我學(xué)習(xí)到了POI、easypoi和easyexcel這3個(gè)java操作Excel的工具,下面這篇文章主要給大家介紹了關(guān)于java操作excel導(dǎo)入導(dǎo)出的3種方式,需要的朋友可以參考下2023-05-05
Java序列化和反序列化_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
把對象轉(zhuǎn)換為字節(jié)序列的過程稱為對象的序列化,把字節(jié)序列恢復(fù)為對象的過程稱為對象的反序列化。接下來通過本文給大家介紹Java序列化和反序列化及主要的兩種用途,感興趣的的友參考下吧2017-05-05
Java內(nèi)存模型之重排序的相關(guān)知識(shí)總結(jié)
重排序是指編譯器和處理器為了優(yōu)化性能而對指令序列進(jìn)行重新排序的一種手段,文中詳細(xì)介紹了Java重排序的相關(guān)知識(shí),需要的朋友可以參考下2021-06-06
剖析Java中HashMap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化
這篇文章主要介紹了Java中HashMap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化,文中以Java 8后HashMap的性能提升來討論了HashMap的一些優(yōu)化點(diǎn),需要的朋友可以參考下2016-05-05
Spring Security學(xué)習(xí)筆記(一)
這篇文章主要介紹了Spring Security的相關(guān)資料,幫助大家開始學(xué)習(xí)Spring Security框架,感興趣的朋友可以了解下2020-09-09

