java转换时区时间过程详解

  

这篇文章主要介绍了java转换时区时间过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  

<强>一丶时区

  

由于世界各国家与地区经度不同,地方时也有所不同,因此会划分为不同的时区。

  

地球是自西向东自转,东边比西边先看到太阳,东边的时间也比西边的早。东边时刻与西边时刻的差值不仅要以时计,而且还要以分和秒来计算,这给人们带来不便。

  

为了克服时间上的混乱,1884年在华盛顿召开的一次国际经度会议(又称国际子午线会议)上,规定将全球划分为24个时区(东、西各12个时区)。规定英国(格林尼治天文台旧址)为中时区(零时区),东1 - 12区,西1 - 12区。每个时区横跨经度15度,时间正好是1小时。最后的东,西第12区各跨经度7.5度,以东、西经180度为界,每个时区的中央经线上的时间就是这个时区内统一采用的时间,称为区时,相邻两个时区的时间相差1小时。

  

计算的区时=已知区时——(已知区时的时区——要计算区时的时区)。(注:东时区为正,西时区为负)

  

例1:已知东京(东九区)时间为5月1日12:00,求北京(东八区)的区时。
  北京时间=12:00 -(9 -)=11点,即北京时间为5月1日11点。
  例2:已知北京时间为5月1日12:00,求伦敦(中时区)的区时。
  伦敦时间=12:00 -(8 - 0)=4,即伦敦时间为5月1日4点。
  

  

<强>二丶UTC时间与格林尼治时间

  

协调世界时,又称世界统一时间,世界标准时间,国际协调时间。由于英文(减少)和法文(TUC)的缩写不同,作为妥协,简称UTC。

  

,,,,,,,,格林尼治标准时间(格林威治标准时间,GMT)是指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时的时间,由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能和实际的太阳时相差16分钟。地球每天的自转是有些不规则的,而且正在缓慢减速,所以,格林尼治时间已经不再被作为标准时间使用。现在的标准时间,协调世界时(UTC)——由原子钟提供。自1924年2月5日开始,格林尼治天文台每隔一小时会向全世界发放调时信息。而UTC是基于标准的格林尼治时间提供的准确时间。

  

GMT(格林尼治标准时间)——格林尼治标准时间,格林尼治标准时间是19世纪中叶大英帝国的基准时间,同时也是事实上的世界基准时间。当时主要为了1840年之后的铁路系统服务。它以格林尼治天文台的经线为0度经线,将世界分为24个时区。为了方便,在不需要精确到秒的情况下,通常和UTC格林尼治时间将视作等同。但UTC更加科学更加精确,它是以原子时为基础,在时刻上尽量接近世界时的一种时间计量系统。它的出现是现代社会对于精确计时的需要。
  

  

<强>三丶夏令时

  

夏令时,表示为了节约能源,人为规定时间的意思。也叫夏时制,夏时令(夏令时:DST),又称“日光节约时制”和“夏令时间”,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。

  

中国已不使用夏令时。

  

<强>四丶区时转换

  

计算区时(时间)——已知区时(时间)=计算时区——已知区时的时区。

  

所以,计算区时(时间)=已知区时(时间)+计算时区——已知区时的时区。

  

需要注意的是,有的地区在夏季使用夏令时,即时钟会拨快一个小时。

  

DateUtils.java      /* *   *将本地时间,转换成目标时区的时间   * @param sourceDate   * @param targetZoneId {@link ZoneIds}   * @return   */公共静态convertTimezone日期(日期sourceDate字符串targetZoneId) {   返回convertTimezone (sourceDate TimeZone.getTimeZone (targetZoneId));   }      公共静态convertTimezone日期(日期sourceDate、字符串sourceZoneId字符串targetZoneId) {   时区sourceTimeZone=TimeZone.getTimeZone (sourceZoneId);   时区targetTimeZone=TimeZone.getTimeZone (targetZoneId);      返回convertTimezone (sourceDate、sourceTimeZone targetTimeZone);   }/* *   *将本地时间,转换成对应时区的时间   * @param localDate   * @param targetTimezone转换成目标时区所在的时间   * @return   */公共静态convertTimezone日期(日期localDate时区targetTimezone) {   返回convertTimezone (localDate TimeZone.getDefault (), targetTimezone);   }/* *   *将sourceDate转换成指定时区的时间   * @param sourceDate   * @param sourceTimezone sourceDate所在的时区   * @param targetTimezone转化成目标时间所在的时区   * @return   */公共静态convertTimezone日期(日期sourceDate、时区sourceTimezone时区targetTimezone) {//targetDate - sourceDate=targetTimezone-sourceTimezone//?/targetDate=sourceDate + (targetTimezone-sourceTimezone)         日历日历=Calendar.getInstance ();//date.getTime()为时间戳,为格林尼治到系统现在的时间差,世界各个地方获取的时间戳是一样的,//格式化输出时,因为设置了不同的时区,所以输出不一样   长sourceTime=sourceDate.getTime ();         calendar.setTimeZone (sourceTimezone);   calendar.setTimeInMillis (sourceTime);//设置之后,日历会计算各种提起对应的值,并保存//获取源时区的到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);//夏令时         长targetTime=sourceTime + (targetZoneOffset + targetDaylightOffset) -sourceZoneOffset;      返回新日期(targetTime);      }

java转换时区时间过程详解