美文网首页
UTC & GWT 时间转化为当地时区时间(java & js

UTC & GWT 时间转化为当地时区时间(java & js

作者: 微风吹皱一池春水 | 来源:发表于2019-07-13 14:33 被阅读0次

    一、基本概念

    1、格林威治时间(GWT)

    格林威治子午线上的地方时,位于伦敦郊区的皇家格林尼治天文台的标准时间,也叫世界时。比如我们中国是东八区,北京时间是(GMT+08:00)

    2、协调世界时间(UTC)
    UTC是根据原子钟来计算时间,现在世界上最精确的原子钟50亿年才会误差1秒,可以说非常精确。

    3、北京时间(CST)
    中国时间的标准。

    4、太平洋时间(PST)

    是在美国、加拿大、墨西哥西海岸靠近太平洋的地区使用,也被称为太平洋时区。

    相比较而言:个人理解 UTC 是标准时间参照,GMT(格林威治时间)、CST(北京时间)、PST(太平洋时间)等等是具体的时区。因为GMT是根据地球的自转和公转来计算时间,而地球的自转正在缓速变慢,所以使用GMT的话,总有一天,打个比方,中午12点,并不是一天太阳当头照的时候,很可能就是早上或者晚上了。所以说UTC更加精确。

    二、夏令时

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

    三、时区的处理:

    服务器时间是东八区时间,前端页面会在全世界各地时区。
    为兼容世界各地时间,需要:

    • 1.服务器拉取的北京时间转为本地时区的时间。
    • 2.将用户本地时间转换为北京时间传给服务器。

    公式:都转换成零时区的时间(UTC时间)
    其他时区时间 + 其他时区时差 = 本地时间 + 本地时差 = UTC时间 = GWT时间

    JS & Javascript代码:

    /**
     * 判断是否为夏令时
     * @param date
     * @returns {boolean}
     */
    function isSummerTime(date) {
      const springTime = new Date(date.getFullYear(), 0, 1);
      const summerTime = new Date(date.getFullYear(), 6, 1);
      if (springTime.getTimezoneOffset() 
          === summerTime.getTimezoneOffset() 
          === date.getTimezoneOffset()) {
        return false;
      } else {
        return true;
      }
    }
    
    /**
     * 北京时间转本地时间
     */
    function getLocalDate(east8date) {
      const targetTimezone = -8;
      const dif = new Date().getTimezoneOffset();
      let localTime = east8date.getTime() 
      + (targetTimezone * 60 * 60 * 1000) - dif * 60 * 1000;
      localTime -= (isSummerTime(east8date) ? 60 * 60 * 1000 : 0);
      return new Date(localTime);
    }
    
    /**
     * 本地时间转北京时间
     */
    function getEast8Date(date) {
      const targetTimezone = -8;
      const dif = new Date().getTimezoneOffset();
      let east8time = date.getTime() + dif * 60 * 1000 
      - (targetTimezone * 60 * 60 * 1000);
      east8time += (isSummerTime(date) ? 60 * 60 * 1000 : 0);
      return new Date(east8time);
    }
    

    Java代码:

    /**
         * 系统时区时间转成北京时区的时间发给云端
         * 云端获取的北京时区时间转成系统时区的时间显示
         */
        public static Calendar timeZoneToCalendar(Calendar calendar,cboolean toBeijingOrLocal) {
            int timeOffset;
            if (toBeijingOrLocal) {
                timeOffset = TimeZone.getDefault().getOffset(System.currentTimeMillis()) 
                - TimeZone.getTimeZone("GMT+08").getRawOffset();
            } else {
                timeOffset = TimeZone.getTimeZone("GMT+08").getRawOffset() 
                - TimeZone.getDefault().getOffset(System.currentTimeMillis());
            }
            Calendar zoneCalendar = Calendar.getInstance();
            long timeInMilis = calendar.getTimeInMillis() - timeOffset;
            zoneCalendar.setTimeInMillis(timeInMilis);
            return zoneCalendar;
        }
    

    四、夏令时实行国家:

    1. 国内:

    从1986年到1991年的六个年度,在全国范围内实行夏时制,1992年起,夏令时暂停实行。

    2.国际:

    • 俄罗斯

    2011-2014使用夏令时

    • 美国

    美国夏时制的实行与否,完全由各州、各县自行决定,不由联邦政府统一规定。目前美国绝大部分地区实行夏令时。

    • 欧盟国家

    欧盟国家和瑞士都是从3月最后一个星期日到10月最后一个星期日实行夏令时。

    • 加拿大

    加拿大从3月第二个星期日到11月第一个星期日实行夏令时,不过萨斯喀彻温省大部分地区不实行。

    • 墨西哥

    墨西哥从4月第一个星期日到10月最后一个星期日实行夏令时,不过在首都墨西哥城,由于市长不同意总统实行夏令时的决定,有的区服从总统实行夏令时,有的区则服从市长不实行夏令时。

    • 新西兰

    新西兰由于处于南半球,所以夏季和北半球相反。它从9月最后一个星期日到4月第一个星期天实行夏时。

    • 澳大利亚

    澳大利亚除北部地区、昆士兰州和西澳(佩斯、珀斯)之外全部实行夏令时。

    相关文章

      网友评论

          本文标题:UTC & GWT 时间转化为当地时区时间(java & js

          本文链接:https://www.haomeiwen.com/subject/nazpkctx.html