一、基本概念
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个国家每年要实行夏令时。
据称最早有夏令时构思的是本杰明·富兰克林
三、时区的处理:
服务器时间是东八区时间,前端页面会在全世界各地时区。
为兼容世界各地时间,需要:
公式:都转换成零时区的时间(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月第一个星期天实行夏时。