欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java轉換時區(qū)時間過程詳解

 更新時間:2019年11月04日 10:27:43   作者:timfruit  
這篇文章主要介紹了java轉換時區(qū)時間過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了java轉換時區(qū)時間過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

一丶時區(qū)

  由于世界各國家與地區(qū)經(jīng)度不同,地方時也有所不同,因此會劃分為不同的時區(qū)。

  地球是自西向東自轉,東邊比西邊先看到太陽,東邊的時間也比西邊的早。東邊時刻與西邊時刻的差值不僅要以時計,而且還要以分和秒來計算,這給人們帶來不便。

  為了克服時間上的混亂,1884年在華盛頓召開的一次國際經(jīng)度會議(又稱國際子午線會議)上,規(guī)定將全球劃分為24個時區(qū)(東、西各12個時區(qū))。規(guī)定英國(格林尼治天文臺舊址)為中時區(qū)(零時區(qū))、東1—12區(qū),西1—12區(qū)。每個時區(qū)橫跨經(jīng)度15度,時間正好是1小時。最后的東、西第12區(qū)各跨經(jīng)度7.5度,以東、西經(jīng)180度為界。每個時區(qū)的中央經(jīng)線上的時間就是這個時區(qū)內統(tǒng)一采用的時間,稱為區(qū)時,相鄰兩個時區(qū)的時間相差1小時。

  計算的區(qū)時=已知區(qū)時-(已知區(qū)時的時區(qū)-要計算區(qū)時的時區(qū))。(注:東時區(qū)為正,西時區(qū)為負)

  例1:已知東京(東九區(qū))時間為5月1日12:00,求北京(東八區(qū))的區(qū)時。
  北京時間=12:00-(9-8)=11:00,即北京時間為5月1日11:00。
  例2:已知北京時間為5月1日12:00,求倫敦(中時區(qū))的區(qū)時。
  倫敦時間=12:00-(8-0)=4:00,即倫敦時間為5月1日4:00。

二丶UTC時間 與 格林尼治時間

  協(xié)調世界時,又稱世界統(tǒng)一時間、世界標準時間、國際協(xié)調時間。由于英文(CUT)和法文(TUC)的縮寫不同,作為妥協(xié),簡稱UTC。

         格林尼治標準時間(Greenwich Mean Time,GMT)是指位于倫敦郊區(qū)的皇家格林尼治天文臺的標準時間,因為本初子午線被定義在通過那里的經(jīng)線。 理論上來說,格林尼治標準時間的正午是指當太陽橫穿格林尼治子午線時的時間。由于地球在它的橢圓軌道里的運動速度不均勻,這個時刻可能和實際的太陽時相差16分鐘。 地球每天的自轉是有些不規(guī)則的,而且正在緩慢減速。所以,格林尼治時間已經(jīng)不再被作為標準時間使用?,F(xiàn)在的標準時間——協(xié)調世界時(UTC)——由原子鐘提供。 自1924年2月5日開始,格林尼治天文臺每隔一小時會向全世界發(fā)放調時信息。而UTC是基于標準的GMT提供的準確時間。

  GMT(Greenwich Mean Time)——格林尼治標準時間,格林尼治標準時間是19 世紀中葉大英帝國的基準時間,同時也是事實上的世界基準時間。當時主要為了1840 年之后的鐵路系統(tǒng)服務。它以格林尼治天文臺的經(jīng)線為0 度經(jīng)線,將世界分為24 個時區(qū)。為了方便,在不需要精確到秒的情況下,通常將GMT 和UTC 視作等同。但UTC 更加科學更加精確,它是以原子時為基礎,在時刻上盡量接近世界時的一種時間計量系統(tǒng)。它的出現(xiàn)是現(xiàn)代社會對于精確計時的需要。

三丶夏令時

夏令時,表示為了節(jié)約能源,人為規(guī)定時間的意思。也叫夏時制,夏時令(Daylight Saving Time:DST),又稱“日光節(jié)約時制”和“夏令時間”,在這一制度實行期間所采用的統(tǒng)一時間稱為“夏令時間”。一般在天亮早的夏季人為將時間調快一小時,可以使人早起早睡,減少照明量,以充分利用光照資源,從而節(jié)約照明用電。各個采納夏時制的國家具體規(guī)定不同。目前全世界有近110個國家每年要實行夏令時。

  中國已不使用夏令時.

四丶區(qū)時轉換

  計算區(qū)時(時間) - 已知區(qū)時(時間) = 計算時區(qū) - 已知區(qū)時的時區(qū).

  所以, 計算區(qū)時(時間)= 已知區(qū)時(時間) + 計算時區(qū) - 已知區(qū)時的時區(qū).

  需要注意的是, 有的地區(qū)在夏季使用夏令時, 即時鐘會撥快一個小時.

  DateUtils.java

/**
   * 將本地時間, 轉換成目標時區(qū)的時間
   * @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);
  }

  /**
   * 將本地時間,轉換成對應時區(qū)的時間
   * @param localDate
   * @param targetTimezone 轉換成目標時區(qū)所在的時間
   * @return
   */
  public static Date convertTimezone(Date localDate, TimeZone targetTimezone){
    return convertTimezone(localDate, TimeZone.getDefault(), targetTimezone);
  }


  /**
   * 將sourceDate轉換成指定時區(qū)的時間
   * @param sourceDate
   * @param sourceTimezone sourceDate所在的時區(qū)
   * @param targetTimezone 轉化成目標時間所在的時區(qū)
   * @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() 為時間戳, 為格林尼治到系統(tǒng)現(xiàn)在的時間差,世界各個地方獲取的時間戳是一樣的,    // 格式化輸出時,因為設置了不同的時區(qū),所以輸出不一樣
    long sourceTime=sourceDate.getTime(); 


    calendar.setTimeZone(sourceTimezone);
    calendar.setTimeInMillis(sourceTime);// 設置之后,calendar會計算各種filed對應的值,并保存

    //獲取源時區(qū)的到UTC的時區(qū)差
    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區(qū)




  //
//  UTC+10 夏莫羅標準時區(qū)
//  UTC-11 美屬薩摩亞標準時區(qū)
//  UTC-10HST夏威夷-阿留申標準時區(qū)
//  UTC-9AKST阿拉斯加標準時區(qū)
//  UTC-8PST太平洋標準時區(qū)
//  UTC-7MST山地標準時區(qū)
//  UTC-6CST中部標準時區(qū)
//  UTC-5EST東部標準時區(qū)
//  UTC-4AST大西洋標準時區(qū)

  //https://baike.baidu.com/item/%E7%BE%8E%E5%9B%BD%E6%97%B6%E9%97%B4/3163209?fr=aladdin
  /*
  太平洋時區(qū):代表城市洛杉磯,與北京相差16小時;
山地時區(qū):代表城市鹽湖城,與北京相差15小時;
中部時區(qū):代表城市芝加哥,與北京相差14小時;
東部時區(qū):代表城市紐約、華盛頓,與北京相差13小時;
夏威夷時區(qū):代表城市:火奴魯魯,與北京相差18小時;
阿拉斯加時區(qū):代表城市:費爾班克斯,與北京相差17小時。
   */
  public static final String US_EST="-5"; //東部標準時區(qū)
  public static final String US_CST="-6";// 中部標準時區(qū)
  public static final String US_MST="-7";// 山地標準時區(qū)
  public static final String US_PST="America/Los_Angeles"; //也可以使用"-8" 太平洋標準時區(qū)


  public static final String JST="Asia/Tokyo";//日本東京
}

測試:

@Test
  public void convertTimezonePstNowTest(){
    // 太平洋時區(qū):代表城市洛杉磯,與北京相差16小時;
    // 但由于實行夏令時, 夏季會快一個小時
    Date now=new Date();

    convertTimeZonePstTest(now);

  }


  @Test
  public void convertTimezonePstTest1(){
    // 太平洋時區(qū):代表城市洛杉磯,與北京相差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);
  }

完整源碼

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java并發(fā)編程之柵欄(CyclicBarrier)實例介紹

    Java并發(fā)編程之柵欄(CyclicBarrier)實例介紹

    這篇文章主要介紹了Java并發(fā)編程之柵欄(CyclicBarrier)實例介紹,柵欄類似閉鎖,但是它們是有區(qū)別的,需要的朋友可以參考下
    2015-04-04
  • SSM項目中配置LOG4J日志的方法

    SSM項目中配置LOG4J日志的方法

    本篇文章主要介紹了SSM項目中配置LOG4J日志的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Struts2之Validator驗證框架的詳細介紹

    Struts2之Validator驗證框架的詳細介紹

    Struts2中提供了數(shù)據(jù)校驗驗證數(shù)據(jù)例如驗證郵件、數(shù)字等,本篇文章介紹了Struts2之Validator的詳細介紹,有興趣的可以了解一下。
    2017-03-03
  • Mybatis 動態(tài)sql的編寫與開啟二級緩存

    Mybatis 動態(tài)sql的編寫與開啟二級緩存

    二級緩存是Mapper級別的緩存,多個SqlSession去操作同一個Mapper中的SQL語句,則這些SqlSession可以共享二級緩存,即二級緩存是跨SqlSession的,這篇文章主要介紹了Mybatis 動態(tài)sql的編寫|開啟二級緩存,需要的朋友可以參考下
    2023-02-02
  • MyBatis入門學習教程-MyBatis快速入門

    MyBatis入門學習教程-MyBatis快速入門

    MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架,這篇文章主要給大家分享MyBatis的一篇快速入門教程
    2021-06-06
  • SpringBoot?2.x?接入非標準SSE格式大模型流式響應的實戰(zhàn)解決方案

    SpringBoot?2.x?接入非標準SSE格式大模型流式響應的實戰(zhàn)解決方案

    本文介紹了在SpringBoot2.7.3環(huán)境中接入非標準SSE格式大模型流式響應的實戰(zhàn)解決方案,通過自定義實現(xiàn),解決了大模型返回數(shù)據(jù)格式不符合標準SSE規(guī)范的問題,關鍵步驟包括引入Gradle依賴、配置WebClient、處理粘包、格式兼容和雙重過濾機制,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • Idea2024創(chuàng)建Maven項目沒有src文件夾的解決步驟

    Idea2024創(chuàng)建Maven項目沒有src文件夾的解決步驟

    本文主要介紹了Idea2024創(chuàng)建Maven項目沒有src文件夾,文中通過圖文示例介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02
  • 在IntelliJ?IDEA中配置SSH服務器開發(fā)環(huán)境并實現(xiàn)固定地址遠程連接的操作方法

    在IntelliJ?IDEA中配置SSH服務器開發(fā)環(huán)境并實現(xiàn)固定地址遠程連接的操作方法

    本文主要介紹如何在IDEA中設置遠程連接服務器開發(fā)環(huán)境,并結合Cpolar內網(wǎng)穿透工具實現(xiàn)無公網(wǎng)遠程連接,然后實現(xiàn)遠程Linux環(huán)境進行開發(fā),本例使用的是IDEA2023.2.5版本,感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • HashMap插入相同key問題

    HashMap插入相同key問題

    這篇文章主要介紹了HashMap插入相同key問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 使用Feign設置Token鑒權調用接口

    使用Feign設置Token鑒權調用接口

    這篇文章主要介紹了使用Feign設置Token鑒權調用接口,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論