JS日期的那些事儿

ECMAScript的日期参考了Java早期版本中的java.util.Date的设计,但由于浏览器对于Date的实现方式不一致导致了一些列的问题。

1. 认识UTC与GMT

协调世界时(英: Coordinated Universal Time 法: Temps Universel Coordonné,作为英语和法语的妥协简称为UTC),其在时刻上尽量接近于格林威治标准时间(GMT)。该时间系统被广泛用于互联网和万维网的标准中,如网络时间协议(Network Time Protocol NTP)就是协调世界时在互联网汇中使用的一种方式。PS: 如果本地时间比UTC时间快,例如中国大陆的时间比UTC快8小时,就会写作UTC+8,俗称东八区。

格林威治标准时间Greenwich Mean Time)是指位于英国伦敦郊区的皇家格林尼治天文台当地的平太阳时。由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林尼治平时基于天文观测本身的缺陷,已经被协调世界时取代。

2. ECMAScript中的Date对象

ECMAScript中的Date对象记录的是从1970年1月1日(UTC)到现在所经过的毫秒数,虽然其核心时间值是UTC,但获取基本日期和时间的基本方法都是在本地时区和偏移量下工作的。需要注意的是,最大日期和最大安全整数不同(Number.MAX_SAFE_INTEGER为9,007,199,254,740,991而日期的范围为±8,640,000,000,000,000毫秒)。

以一个函数的形式来调用Date对象,会返回一个代表当前日期和时间的字符串。

  • 构造函数

    Date对象的构造函数有四种基本形式:

    1. 没有参数: 如果没有提供参数,返回当前时刻的日期和时间。
    2. UNIX时间戳:表示1970年1月1日00:00:00(UTC)以来的毫秒数
    3. 时间戳字符串:表示日期的字符串,应符合RFC2822或ISO8601的格式。由于浏览器之间的差异性,不推荐使用该方法解析日期字符串(在ISO8601中,只有日期会被处理为UTC时间)
    4. 分别提供日期与时间的每一个成员。
      • year: 表示年份的整数值,0-99会被映射至1900年-1999年,其他值代表实际年份。
      • monthIndex: 表示月份的整数值,从0(1月)到11(12月)
      • date: 表示一个月中的第几天的整数值,从1开始,默认为1
      • hours: 表示一天中的小时数的整数值(24小时制),默认为0
      • minutes: 表示一个完整的时间中的分钟部分的整数值,默认为0
      • seconds: 表示一个完整时间中的秒钟部分的整数值,默认为0
      • Milliseconds: 表示一个完整时间中的毫秒部分的整数值,默认为0
  • 解析时间字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 以下代码摘自Dayjs
const parseDate = (cfg) => {
const { date, utc } = cfg
const isUndefined = s => s === undefined
if (date === null) return new Date(NaN) // null is invalid
if (isUndefined(date)) return new Date() // today
if (date instanceof Date) return new Date(date)
if (typeof date === 'string' && !/Z$/i.test(date)) {
const d = date.match(/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[^0-9]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?.?(\d+)?$/)
if (d) {
const m = d[2] - 1 || 0
const ms = (d[7] || '0').substring(0, 3)
if (utc) {
return new Date(Date.UTC(d[1], m, d[3]
|| 1, d[4] || 0, d[5] || 0, d[6] || 0, ms))
}
return new Date(d[1], m, d[3]
|| 1, d[4] || 0, d[5] || 0, d[6] || 0, ms)
}
}
return new Date(date) // everything else
}
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • © 2019-2021 musi

请我喝杯咖啡吧~

支付宝
微信