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

一、基本概念

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 & javascript))