Java對世界不同時區(qū)timezone之間時間轉(zhuǎn)換的處理方法
最近出現(xiàn)一個問題是這樣的:我們的系統(tǒng)在國外打印的日志時間由于時差關系和國內(nèi)不一致,看起來不方便,希望國外的日志和國內(nèi)保持一致,即:需要對不同時區(qū)的時間做轉(zhuǎn)換調(diào)整,統(tǒng)一為國內(nèi)時間。
一、關于時區(qū)的一些概念
1.1 什么是時區(qū)?
timezone,即由于世界各國家與地區(qū)經(jīng)度不同,地方時也有所不同,按照經(jīng)度將全球劃分為24個時區(qū)。
時區(qū)有相應的英文字母縮寫,例如GMT,UTC,CST等,常見的時區(qū),具體參考:java時區(qū)理解。
1.2 什么是夏令時?
通俗易懂的解釋就是:夏令時開始的時候,大家在夜里2點把表往前調(diào)一個小時,即本來兩點,被你手動調(diào)成了三點,如果你七點起床,那你那天晚上就會少睡一個小時,為什么這么做是因為夏天的時候7點其實天已經(jīng)亮了,這樣你到了第二天晚上8點(其實是之前的7點)就應該睡覺了,這樣就可以節(jié)省電了,所以夏令時叫(Daylight Saving Time:DST),這篇文章講了為什么要有夏令時?什么時候去修改表的時間?為什么是晚上2點修改?反對夏令時?還有人寫paper說夏令時沒什么用。
二、如何在不同時區(qū)之間轉(zhuǎn)換時間
上部分分析了不同時區(qū),還有夏令時的區(qū)別,即我們在轉(zhuǎn)換時區(qū)的時候要考慮這兩個問題,基本思路是:
- 獲取到源時區(qū)相對于GMT的差距(考慮夏令時)。
- 獲取到目的時區(qū)相對于GMT的差距(考慮夏令時)。
- 用當前的時間 - 源差距 + 目的差距
代碼如下所示:
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中關于時間處理的類
關于Date,Calendar,LocalDate/LocalTime的介紹文章。
參考資料:
Java時區(qū)處理之Date,Calendar,TimeZone,SimpleDateFormat
到此這篇關于Java對世界不同時區(qū)timezone之間時間轉(zhuǎn)換的處理方法的文章就介紹到這了,更多相關Java不同時區(qū)timezone時間轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中的instanceof關鍵字在Android中的用法實例詳解
instanceof是Java的一個二元操作符,和==,>,<是同一類東西。接下來通過本文給大家介紹Java中的instanceof關鍵字在Android中的用法,非常不錯,具有參考借鑒價值,感興趣的朋友一起學習吧2016-07-07
使用Nacos實現(xiàn)動態(tài)路由的步驟和代碼示例
這篇文章主要介紹了使用 Nacos 實現(xiàn) Spring Cloud Gateway 的動態(tài)路由,本文給大家介紹了具體的實現(xiàn)步驟和代碼案例,感興趣的小伙伴跟著小編一起來看看吧2024-09-09
Springboot如何同時裝配兩個相同類型數(shù)據(jù)庫
這篇文章主要介紹了Springboot如何同時裝配兩個相同類型數(shù)據(jù)庫,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Java序列化和反序列化_動力節(jié)點Java學院整理
把對象轉(zhuǎn)換為字節(jié)序列的過程稱為對象的序列化,把字節(jié)序列恢復為對象的過程稱為對象的反序列化。接下來通過本文給大家介紹Java序列化和反序列化及主要的兩種用途,感興趣的的友參考下吧2017-05-05
剖析Java中HashMap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化
這篇文章主要介紹了Java中HashMap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化,文中以Java 8后HashMap的性能提升來討論了HashMap的一些優(yōu)化點,需要的朋友可以參考下2016-05-05

