js 日期 Date 格式化与时间戳
1、 日期转换
Date 转 String
/**
* 日期格式化 Date -> String
* @param {string} fmt yyyy-MM-dd HH:mm:ss
* @param {Date} date
* @returns {string}
*/
export function dateFormat(fmt, date) {
if (!date) {
date = new Date()
}
var o = {
'M+': date.getMonth() + 1, // 月份
'd+': date.getDate(), // 日
'h+': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, // 小时
'H+': date.getHours(), // 小时
'm+': date.getMinutes(), // 分
's+': date.getSeconds(), // 秒
'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
S: date.getMilliseconds() // 毫秒
}
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
}
for (var k in o) {
if (new RegExp('(' + k + ')').test(fmt)) {
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
}
}
return fmt
}
String 转 Date
dateStr = dateStr.replace(/-/g, '/') // '-' 转 '/'
// 根据时间字符串 新建Date,Safari 不支持“2018-05-12”
let date = new Date('2018/05/12')
// 时间字符串可以是 年/月,年/月/日, 年/月/日 时:分:秒
// safari 不支持 年/月,要写全 年/月/日
let date = new Date('2018/5/12 10:22:20')
let date = new Date(1601481600000) // 根据毫秒数 新建Date
2、关于时间戳
Date 类型实例的 getTime() 和 Date.now() 返回的都是 自1970 年 1 月 1 日 00:00:00 (UTC) 到当前时间的毫秒数,这里的 UTC 指的就是 0 时区。
时间戳,指的就是自 0时区的1970/1/1 00:00:00 那一刻到此刻的毫秒数。可以说时间戳指的是全球的某一刻,只不过在这一刻各时区的日期时间是不同的。
所以同一个时间戳,在不同时区内转换为日期时间是不一样的
// 测试,修改操作系统的时区
// 中国时区
new Date(1640835505470)
Thu Dec 30 2021 11:38:25 GMT+0800 (中国标准时间)
(new Date('2021/12/29 11:43:30')).getTime()
1640749410000
// 美国东部时区
new Date(1640835505470)
Wed Dec 29 2021 22:38:25 GMT-0500 (北美东部标准时间)
(new Date('2021/12/29 11:43:30')).getTime()
1640796210000
可知:相同的时间戳在不同的时区转换得到的日期时间不同,反之,相同日期时间在不同的时区转换得到的时间戳也不同。
3 GMT 和 UTC
GMT:世界时,即指格林尼治所在地的标准时间
UTC: 世界协调时间,是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以「秒」为单位的国际原子时所综合精算而成的时间,计算过程相当严谨精密,因此若以「世界标准时间」的角度来说,UTC比GMT来得更加精准。其误差值必须保持在0.9秒以内,若大于0.9秒则由位于巴黎的国际地球自转事务中央局发布闰秒,使UTC与地球自转周期一致。所以基本上UTC的本质强调的是比GMT更为精确的世界时间标准,不过对于现行表款来说,GMT与UTC的功能与精确度是没有差别的。
一般,GMT 或 UTC 时间都是指 0 时区的时间,而别的区域会加上 GMT +/- 时区数,或 UTC +/- 时区数
如:
东八区:Thu Dec 30 2021 11:38:25 GMT+0800 (中国标准时间)
西五区:Wed Dec 29 2021 22:38:25 GMT-0500 (北美东部标准时间)