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 (北美东部标准时间)

posted @ 2021-08-27 18:27  zhanglw  阅读(220)  评论(1编辑  收藏  举报