您好,登錄后才能下訂單哦!
這篇文章主要介紹了java轉換時區時間過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
一丶時區
由于世界各國家與地區經度不同,地方時也有所不同,因此會劃分為不同的時區。
地球是自西向東自轉,東邊比西邊先看到太陽,東邊的時間也比西邊的早。東邊時刻與西邊時刻的差值不僅要以時計,而且還要以分和秒來計算,這給人們帶來不便。
為了克服時間上的混亂,1884年在華盛頓召開的一次國際經度會議(又稱國際子午線會議)上,規定將全球劃分為24個時區(東、西各12個時區)。規定英國(格林尼治天文臺舊址)為中時區(零時區)、東1—12區,西1—12區。每個時區橫跨經度15度,時間正好是1小時。最后的東、西第12區各跨經度7.5度,以東、西經180度為界。每個時區的中央經線上的時間就是這個時區內統一采用的時間,稱為區時,相鄰兩個時區的時間相差1小時。
計算的區時=已知區時-(已知區時的時區-要計算區時的時區)。(注:東時區為正,西時區為負)
例1:已知東京(東九區)時間為5月1日12:00,求北京(東八區)的區時。
北京時間=12:00-(9-8)=11:00,即北京時間為5月1日11:00。
例2:已知北京時間為5月1日12:00,求倫敦(中時區)的區時。
倫敦時間=12:00-(8-0)=4:00,即倫敦時間為5月1日4:00。
二丶UTC時間 與 格林尼治時間
協調世界時,又稱世界統一時間、世界標準時間、國際協調時間。由于英文(CUT)和法文(TUC)的縮寫不同,作為妥協,簡稱UTC。
格林尼治標準時間(Greenwich Mean Time,GMT)是指位于倫敦郊區的皇家格林尼治天文臺的標準時間,因為本初子午線被定義在通過那里的經線。 理論上來說,格林尼治標準時間的正午是指當太陽橫穿格林尼治子午線時的時間。由于地球在它的橢圓軌道里的運動速度不均勻,這個時刻可能和實際的太陽時相差16分鐘。 地球每天的自轉是有些不規則的,而且正在緩慢減速。所以,格林尼治時間已經不再被作為標準時間使用。現在的標準時間——協調世界時(UTC)——由原子鐘提供。 自1924年2月5日開始,格林尼治天文臺每隔一小時會向全世界發放調時信息。而UTC是基于標準的GMT提供的準確時間。
GMT(Greenwich Mean Time)——格林尼治標準時間,格林尼治標準時間是19 世紀中葉大英帝國的基準時間,同時也是事實上的世界基準時間。當時主要為了1840 年之后的鐵路系統服務。它以格林尼治天文臺的經線為0 度經線,將世界分為24 個時區。為了方便,在不需要精確到秒的情況下,通常將GMT 和UTC 視作等同。但UTC 更加科學更加精確,它是以原子時為基礎,在時刻上盡量接近世界時的一種時間計量系統。它的出現是現代社會對于精確計時的需要。
三丶夏令時
夏令時,表示為了節約能源,人為規定時間的意思。也叫夏時制,夏時令(Daylight Saving Time:DST),又稱“日光節約時制”和“夏令時間”,在這一制度實行期間所采用的統一時間稱為“夏令時間”。一般在天亮早的夏季人為將時間調快一小時,可以使人早起早睡,減少照明量,以充分利用光照資源,從而節約照明用電。各個采納夏時制的國家具體規定不同。目前全世界有近110個國家每年要實行夏令時。
中國已不使用夏令時.
四丶區時轉換
計算區時(時間) - 已知區時(時間) = 計算時區 - 已知區時的時區.
所以, 計算區時(時間)= 已知區時(時間) + 計算時區 - 已知區時的時區.
需要注意的是, 有的地區在夏季使用夏令時, 即時鐘會撥快一個小時.
DateUtils.java
/** * 將本地時間, 轉換成目標時區的時間 * @param sourceDate * @param targetZoneId {@link ZoneIds} * @return */ public static Date convertTimezone(Date sourceDate, String targetZoneId){ return convertTimezone(sourceDate, TimeZone.getTimeZone(targetZoneId)); } public static Date convertTimezone(Date sourceDate, String sourceZoneId, String targetZoneId){ TimeZone sourceTimeZone=TimeZone.getTimeZone(sourceZoneId); TimeZone targetTimeZone=TimeZone.getTimeZone(targetZoneId); return convertTimezone(sourceDate, sourceTimeZone, targetTimeZone); } /** * 將本地時間,轉換成對應時區的時間 * @param localDate * @param targetTimezone 轉換成目標時區所在的時間 * @return */ public static Date convertTimezone(Date localDate, TimeZone targetTimezone){ return convertTimezone(localDate, TimeZone.getDefault(), targetTimezone); } /** * 將sourceDate轉換成指定時區的時間 * @param sourceDate * @param sourceTimezone sourceDate所在的時區 * @param targetTimezone 轉化成目標時間所在的時區 * @return */ public static Date convertTimezone(Date sourceDate, TimeZone sourceTimezone, TimeZone targetTimezone){ // targetDate - sourceDate=targetTimezone-sourceTimezone // ---> // targetDate=sourceDate + (targetTimezone-sourceTimezone) Calendar calendar=Calendar.getInstance(); // date.getTime() 為時間戳, 為格林尼治到系統現在的時間差,世界各個地方獲取的時間戳是一樣的, // 格式化輸出時,因為設置了不同的時區,所以輸出不一樣 long sourceTime=sourceDate.getTime(); calendar.setTimeZone(sourceTimezone); calendar.setTimeInMillis(sourceTime);// 設置之后,calendar會計算各種filed對應的值,并保存 //獲取源時區的到UTC的時區差 int sourceZoneOffset=calendar.get(Calendar.ZONE_OFFSET); calendar.setTimeZone(targetTimezone); calendar.setTimeInMillis(sourceTime); int targetZoneOffset=calendar.get(Calendar.ZONE_OFFSET); int targetDaylightOffset=calendar.get(Calendar.DST_OFFSET); // 夏令時 long targetTime=sourceTime+ (targetZoneOffset+targetDaylightOffset) -sourceZoneOffset; return new Date(targetTime); }
ZoneIds.java
/** * * @see java.time.ZoneId#SHORT_IDS * @author TimFruit * @date 19-11-2 下午6:02 */ public class ZoneIds { /* EST - -05:00 HST - -10:00 MST - -07:00 ACT - Australia/Darwin AET - Australia/Sydney AGT - America/Argentina/Buenos_Aires ART - Africa/Cairo AST - America/Anchorage BET - America/Sao_Paulo BST - Asia/Dhaka CAT - Africa/Harare CNT - America/St_Johns CST - America/Chicago CTT - Asia/Shanghai EAT - Africa/Addis_Ababa ECT - Europe/Paris IET - America/Indiana/Indianapolis IST - Asia/Kolkata JST - Asia/Tokyo MIT - Pacific/Apia NET - Asia/Yerevan NST - Pacific/Auckland PLT - Asia/Karachi PNT - America/Phoenix PRT - America/Puerto_Rico PST - America/Los_Angeles SST - Pacific/Guadalcanal VST - Asia/Ho_Chi_Min */ public static final String UTC="Z";// utc國際時間 public static final String DEFAULT=TimeZone.getDefault().toZoneId().getId(); public static final String BEIJING="Asia/Shanghai"; //也可以使用"+8" 北京在東8區 // // UTC+10 夏莫羅標準時區 // UTC-11 美屬薩摩亞標準時區 // UTC-10HST夏威夷-阿留申標準時區 // UTC-9AKST阿拉斯加標準時區 // UTC-8PST太平洋標準時區 // UTC-7MST山地標準時區 // UTC-6CST中部標準時區 // UTC-5EST東部標準時區 // UTC-4AST大西洋標準時區 //https://baike.baidu.com/item/%E7%BE%8E%E5%9B%BD%E6%97%B6%E9%97%B4/3163209?fr=aladdin /* 太平洋時區:代表城市洛杉磯,與北京相差16小時; 山地時區:代表城市鹽湖城,與北京相差15小時; 中部時區:代表城市芝加哥,與北京相差14小時; 東部時區:代表城市紐約、華盛頓,與北京相差13小時; 夏威夷時區:代表城市:火奴魯魯,與北京相差18小時; 阿拉斯加時區:代表城市:費爾班克斯,與北京相差17小時。 */ public static final String US_EST="-5"; //東部標準時區 public static final String US_CST="-6";// 中部標準時區 public static final String US_MST="-7";// 山地標準時區 public static final String US_PST="America/Los_Angeles"; //也可以使用"-8" 太平洋標準時區 public static final String JST="Asia/Tokyo";//日本東京 }
測試:
@Test public void convertTimezonePstNowTest(){ // 太平洋時區:代表城市洛杉磯,與北京相差16小時; // 但由于實行夏令時, 夏季會快一個小時 Date now=new Date(); convertTimeZonePstTest(now); } @Test public void convertTimezonePstTest1(){ // 太平洋時區:代表城市洛杉磯,與北京相差16小時; // 但由于實行夏令時, 夏季會快一個小時 Date now=DateUtils.parse("2019-11-03 03:00:00"); convertTimeZonePstTest(now); now=DateUtils.parse("2019-11-03 06:00:00"); convertTimeZonePstTest(now); now=DateUtils.parse("2019-11-03 09:00:00"); convertTimeZonePstTest(now); now=DateUtils.parse("2019-11-03 11:00:00"); convertTimeZonePstTest(now); now=DateUtils.parse("2019-11-03 14:00:00"); convertTimeZonePstTest(now); now=DateUtils.parse("2019-11-03 16:00:00"); convertTimeZonePstTest(now); now=DateUtils.parse("2019-11-03 18:00:00"); convertTimeZonePstTest(now); now=DateUtils.parse("2019-11-03 19:00:00"); convertTimeZonePstTest(now); now=DateUtils.parse("2019-11-03 20:00:00"); convertTimeZonePstTest(now); now=DateUtils.parse("2019-11-03 23:00:00"); convertTimeZonePstTest(now); } private void convertTimeZonePstTest(Date sourceDate){ Date target=DateUtils.convertTimezone(sourceDate, ZoneIds.US_PST); long sub=sourceDate.getTime()-target.getTime(); System.out.println("北京時間與洛杉磯時間相差時間: "+sub/(60*60*1000) +" 小時"); //由于有夏令時, 使用jdk提供的方法驗證 SimpleDateFormat pstSdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); pstSdf.setTimeZone(TimeZone.getTimeZone(ZoneIds.US_PST)); String expectFormat=pstSdf.format(sourceDate); String targetFormat=DateUtils.format(target); System.out.println("洛杉磯時間: "+targetFormat); Assert.assertEquals(expectFormat,targetFormat); }
完整源碼
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。