基本概念
- UT - 世界时
- TAI - 国际原子时
- GMT - 格林尼治标准时间/格林威治平均时间
- UTC - 协调世界时
- LT - 本地时间
这篇文章解释的都很详细 一些时间的概念与区分(UTC、GMT、LT、TAI等)
我们一般认为GMT和UTC是一样的,都与英国伦敦的本地时相同。
UTC或GMT与LT如下的换算关系:LT = UTC + 时区差;
东区是加相应的时区差,西区是减时区差。如北京是东八区,则北京时间=UTC+8.
我们用 new Date()
获取的时间都是本地时间,也就是电脑的系统时间。
- 时间戳 / UNIX时间
一个 Unix 时间戳(Unix Time Stamp),它是一个整数值,表示自1970年1月1日00:00:00 UTC(the Unix epoch)以来的毫秒数,忽略了闰秒。请注意大多数 Unix 时间戳功能仅精确到最接近的秒。
时区差计算
getTimezoneOffset 方法返回协调世界时(UTC)相对于当前时区的时间差值,单位为分钟。
时区偏差(time-zone offset)表示协调世界时(UTC)与本地时区之间的差值,单位为分钟。需要注意的是如果本地时区晚于协调世界时,则该差值为正值,如果早于协调世界时则为负值。例如你所在时区为 UTC+10(澳大利亚东部标准时间),将会返回 -600。对于同一个时区,夏令时(Daylight Saving Time)将会改变这个值。
new Date().getTimezoneOffset() // -480 我所在的时区是东八区(UTC+8)
本地时间转UTC时间(时间戳)
toISOString() 方法返回一个 ISO(ISO 8601 Extended Format)格式的字符串: YYYY-MM-DDTHH:mm:ss.sssZ。时区总是UTC(协调世界时),加一个后缀“Z”标识。
new Date("2019-07-04 00:00:00") // Thu Jul 04 2019 00:00:00 GMT+0800 (中国标准时间)
new Date("2019-07-04 00:00:00").toISOString() // "2019-07-03T16:00:00.000Z"
从上面打印结果可以看到:
本地时间是 2019-07-04 00:00:00
UTC时间是 2019-07-03 16:00:00
例子
获取跟本地时间一样的UTC时间,比如:获取UTC时间 2019-07-04 00:00:00
- 获取时区差
const localOffset = new Date().getTimezoneOffset() * 60 * 1000;
- 上面的公式还记得吗:LT = UTC + 时区差
// 获取本地时间戳 const localTimeStamp = new Date("2019-07-04 00:00:00").getTime(); // UTC = LT - 时区差 const utcTimeStamp = localTimeStamp - localOffset; console.log(new Date(utcTimeStamp).toISOString()); // "2019-07-04T00:00:00.000Z"
- 整理一下
function toUTCTimeOrStamp(date, unix) { // 获取时区差 const localOffset = new Date().getTimezoneOffset() * 60 * 1000; // 获取本地时间戳 const localTimeStamp = new Date(date).getTime(); // 计算UTC时间戳 const utcTimeStamp = localTimeStamp - localOffset; // 计算UTC时间 const utcTime = new Date(utcTimeStamp).toISOString(); return unix ? utcTimeStamp : utcTime; } toUTCTimeOrStamp("2019-07-04 00:00:00", true); // 1562198400000 toUTCTimeOrStamp("2019-07-04 00:00:00"); // "2019-07-04T00:00:00.000Z"
需求:
- 本地选择一个时间,将这个时间转换成阿拉伯的时间存储。
- 取出这个时间展示为在阿拉伯本地显示的时间。 阿拉伯(东三区 +3)
-
本地时间 -> UTC时间:
UTC = LT - localOffset(getTimezoneOffset() -> -8)
-
阿拉伯本地时间:
ZoneLT = UTC + zoneOffset(getTimezoneOffset() -> -3) = LT - localOffset(getTimezoneOffset() -> -8) + zoneOffset(getTimezoneOffset() -> -3) = LT - (localOffset + zone(+3))
// 计算时区 function GetOffsetTime(zone) { // 本地时区偏差 注意 getTimezoneOffset 返回值单位为分钟 const localOffset = new Date().getTimezoneOffset(); // 给定时区偏差 return (localOffset + zone * 60) * 60; }
// 计算阿拉伯本地时间戳 function ToZoneTimeStamp(timeStamp, zone) { return (timeStamp / 1000 - GetOffsetTime(zone)); } // 存储阿拉伯本地时间戳 const selectDate = new Date('2019-07-04 00:00:00') const timeStamp = ToZoneTimeStamp(selectDate, 3); console.log(timeStamp); // 1562187600
// 将阿拉伯本地时间显示出来:1562187600 function ToZoneTime(timeStamp, zone) { // const zoneTimeStamp = (timeStamp + zone * 60 * 60) * 1000; // utcDateFormat 函数在下面 const zoneTime = utcDateFormat(new Date(zoneTimeStamp)); return zoneTime; } const zoneDate = ToZoneTime(1562187600, 3); console.log(zoneDate); // "2019-07-04 00:00:00",不管本地时间是多少,都会显示这个阿拉伯时间
时间格式转换
// 小于10补0
function padZero(num) {
return num > 9 ? num : `0${num}`;
}
// 本地时间格式
function localDateFormat(date) {
const YYYY = date.getFullYear();
const MM = padZero(date.getMonth() + 1);
const DD = padZero(date.getDate());
const hh = padZero(date.getHours());
const mm = padZero(date.getMinutes());
const ss = padZero(date.getSeconds());
return `${YYYY}-${MM}-${DD} ${hh}:${mm}:${ss}`;
}
// UTC时间格式
function utcDateFormat(date) {
const YYYY = date.getUTCFullYear();
const MM = padZero(date.getUTCMonth() + 1);
const DD = padZero(date.getUTCDate());
const hh = padZero(date.getUTCHours());
const mm = padZero(date.getUTCMinutes());
const ss = padZero(date.getUTCSeconds());
return `${YYYY}-${MM}-${DD} ${hh}:${mm}:${ss}`;
}
localDateFormat(new Date());
utcDateFormat(new Date());