一、基本概念
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月第一个星期天实行夏时。
- 澳大利亚
澳大利亚除北部地区、昆士兰州和西澳(佩斯、珀斯)之外全部实行夏令时。