Java對世界不同時區(qū)timezone之間時間轉(zhuǎn)換的處理方法
最近出現(xiàn)一個問題是這樣的:我們的系統(tǒng)在國外打印的日志時間由于時差關(guān)系和國內(nèi)不一致,看起來不方便,希望國外的日志和國內(nèi)保持一致,即:需要對不同時區(qū)的時間做轉(zhuǎn)換調(diào)整,統(tǒng)一為國內(nèi)時間。
一、關(guān)于時區(qū)的一些概念
1.1 什么是時區(qū)?
timezone,即由于世界各國家與地區(qū)經(jīng)度不同,地方時也有所不同,按照經(jīng)度將全球劃分為24個時區(qū)。
時區(qū)有相應(yīng)的英文字母縮寫,例如GMT,UTC,CST等,常見的時區(qū),具體參考:java時區(qū)理解。
1.2 什么是夏令時?
通俗易懂的解釋就是:夏令時開始的時候,大家在夜里2點把表往前調(diào)一個小時,即本來兩點,被你手動調(diào)成了三點,如果你七點起床,那你那天晚上就會少睡一個小時,為什么這么做是因為夏天的時候7點其實天已經(jīng)亮了,這樣你到了第二天晚上8點(其實是之前的7點)就應(yīng)該睡覺了,這樣就可以節(jié)省電了,所以夏令時叫(Daylight Saving Time:DST),這篇文章講了為什么要有夏令時?什么時候去修改表的時間?為什么是晚上2點修改?反對夏令時?還有人寫paper說夏令時沒什么用。
二、如何在不同時區(qū)之間轉(zhuǎn)換時間
上部分分析了不同時區(qū),還有夏令時的區(qū)別,即我們在轉(zhuǎn)換時區(qū)的時候要考慮這兩個問題,基本思路是:
- 獲取到源時區(qū)相對于GMT的差距(考慮夏令時)。
- 獲取到目的時區(qū)相對于GMT的差距(考慮夏令時)。
- 用當(dāng)前的時間 - 源差距 + 目的差距
代碼如下所示:
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)于時間處理的類
關(guān)于Date,Calendar,LocalDate/LocalTime的介紹文章。
參考資料:
Java時區(qū)處理之Date,Calendar,TimeZone,SimpleDateFormat
到此這篇關(guān)于Java對世界不同時區(qū)timezone之間時間轉(zhuǎn)換的處理方法的文章就介紹到這了,更多相關(guān)Java不同時區(qū)timezone時間轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在spring-boot工程中添加spring mvc攔截器
這篇文章主要介紹了在spring-boot工程中添加spring mvc攔截器,Spring MVC的攔截器(Interceptor)不是Filter,同樣可以實現(xiàn)請求的預(yù)處理、后處理。,需要的朋友可以參考下2019-06-06Spring Cloud Hystrix線程池不足的解決方法
這篇文章主要介紹了Spring Cloud Hystrix線程池不足的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02