java変換時区時間過程の詳細解


この文章は主にjava変換時の時間過程を紹介しています。ここでは例示的なコードを通して紹介された非常に詳細で、皆さんの学習や仕事に対して一定の参考学習価値を持っています。必要な友達は下記を参考にしてください。
一丶タイムゾーン
世界の国々と地域の経纬が违いますので、地方の时も违います。
地球は西から東に回るので、東の方が西より先に太陽が見えます。東の方も西より早いです。東の時刻と西の時刻の差は時計だけでなく、分と秒で計算されるので、不便です。
時間的な混乱を克服するため、1884年にワシントンで開かれた国際経済会議(国際子午線会議ともいう)では、世界を24時間区(東、西の各12時間区)に分けることが定められています。イギリス(グリニッジ天文台旧跡)は中時区(零時区)、東1-12区、西1-12区と定められています。時間帯ごとに経度15度をまたいで、時間はちょうど1時間です。最後の東、西の12区はそれぞれ経度7.5度にまたがり、東、西の180度を境にします。各タイムゾーンの中央経線上の時間はこのタイムゾーン内で統一的に採用された時間で、区と呼ばれています。隣接する二つのタイムゾーンの時間差は1時間です。
計算されたエリア=既知のエリアの場合-(既知のエリアのタイムゾーン-セルを計算したい場合のタイムゾーン)。注:東時区は正で、西時区は負です。
例1:東京(東九区)時間は5月1日12時で、北京(東八区)の区域を求めます。
北京標準時=12:00-(9-8)=11:00北京時間は5月1日11:00です。
例2:北京時間は5月1日12時で、ロンドン(中時区)の区域を求めています。
ロンドン時間=12:00-(8-0)=4:00、つまりロンドン時間は5月1日4:00です。
二丶UTC時間とグリニッジ時間
世界を協調する時、世界統一時間、世界標準時間、国際協調時間とも言われます。英語(CUT)とフランス語(TBC)の略語が異なるため、妥協としてUTCと略される。
         グリニッジ標準時(Green Wich Mean Time、GMT)は、ロンドンの郊外にある皇室グリニッジ天文台の標準時間を指しています。理論的には、グリニッジの標準時間の正午とは、太陽がグリニッジ子午線を横切る時のことです。地球はその楕円軌道の中の運動速度が不均一であるため、この時刻は実際の太陽と16分違っているかもしれない。地球の自転は不規則で、ゆっくりと減速している。だから、グリニッジ時間はもう標準時間として使われなくなりました。現在の標準時間――世界を協調する時(UTC)は原子時計から提供されます。1924年2月5日から、グリニッジ天文台は1時間ごとに世界に調査情報を配布しています。UTCは標準的なGMTに基づいて提供される正確な時間である。
GMT(Green wich 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); 

  }
Zone Ids.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);
  }



ソースの整合性
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。