1. JavaScript 基础

  2. 深入数据和类型

  3. 函数进阶

  4. 运算符

  5. 浏览器存储

  6. Document

  7. Web API

  8. 事件

  9. 工具与规范

  10. 实例

  11. 练习

日期

JavaScript 中有一个内建的对象 Date, 提供了日期与时间的存储与管理。

创建

直接调用 new Date() 是最简单的办法,它返回一个保存着当前时间的对象。

$$edit$$
$$jsdemo$$
let now = new Date()
alert(now) // 当前时间

总共有以下几种创建方法:

  • new Date():返回当前时间。
  • new Date(timestamp):通过时间戳创建,这里的时间戳是毫秒单位。
  • new Date(dateString):表示日期的字符串值,符合IETF-compliant RFC 2822 timestamps 或 version of ISO8601 标准。
  • new Date(year, monthIndex [, date [, hours [, minutes [, seconds [, milliseconds]]]]]):通过年、月( 从 0 开始,0 表示 1月 ) 、日、小时、分钟、秒、毫秒来创建一个 Date 对象,只有年、月是必填的,其他为可选参数。

$$tip

在线时间戳工具

$$

以下是几个创建的实例:

$$jsdemo$$
$$edit$$
new Date() // 当前时间
new Date(7956886942000) // Fri Feb 22 2222 22:22:22 GMT+0800 (香港标准时间)
new Date("2222-02-22 22:22:22") // Fri Feb 22 2222 22:22:22 GMT+0800 (香港标准时间)
new Date(2222, 1, 22, 22, 22, 22) // Fri Feb 22 2222 22:22:22 GMT+0800 (香港标准时间)

通过设定年月日等参数创建

new Date(year, monthIndex [, date [, hours [, minutes [, seconds [, milliseconds]]]]]) 有几个注意事项:

  • 如果 year 在 0 到 99 间会被映射至 1900 年至 1999年。
  • month 计数是从 0 (一月)开始至 11 (十二月)。
  • date 表示当月日期,默认值为 1
  • hours/minutes/seconds/milliseconds 的默认值均为 0
$$jsdemo$$
$$edit$$
// 当你想创建 22年2月22日时

// 自动映射至 1900
new Date(22, 1, 22) // Wed Feb 22 1922 00:00:00 GMT+0800 (香港标准时间),1922年2月22日

// 换一种方法
let date = new Date(22, 1, 22)
date.setFullYear(22) // Tue Feb 22 0022 00:00:00 GMT+0736 (香港标准时间)

$$tip

更多年份设置的解释可以参考 Javascript date 01/01/0001 - stackoverflow。

$$

常用方法

获取日期与时间

以下是获取一些时间相关的值:

  • getFullYear():获取4位年份。
  • getMonth():获取月份,从 0 至 11。
  • getDate():返回当月的第几天。
  • getHours():返回小时。
  • getMinutes():返回分钟。
  • getSeconds():返回秒。
  • getMilliseconds():返回毫秒。
  • getDay():返回这周的第几天。
  • getTime():返回日期的时间戳,以毫秒为单位,与 valueOf 一致。
  • valueOf():返回日期的时间戳,以毫秒为单位。
  • getTimezoneOffset():返回 UTC 与本地时区的时差

$$tip

以上都是根据当地时区返回,也可以返回 UTC 时区,只需加上 UTC,如 getUTCDay()。getTime、valueOf、getTimezoneOffset 没有 UTC 变体。

$$

$$jsdemo$$
$$edit$$
alert(new Date().getTime()) // 当前时间戳

// 如果你在时区 UTC-1,输出 60
// 如果你在时区 UTC+3,输出 -180
alert(new Date().getTimezoneOffset()) // 北京时间正八时区,UTC+8,-480

设置日期与时间

以下方法可以设置时间。

  • setFullYear(year, [month], [date])
  • setMonth(month, [date])
  • setDate(date)
  • setHours(hour, [min], [sec], [ms])
  • setMinutes(min, [sec], [ms])
  • setSeconds(sec, [ms])
  • setMilliseconds(ms)
  • setTime(milliseconds)

$$tip

同样的,以上方法除了 setTime 都有 UTC 变体。

$$

获取当前时间戳

获取时间戳有以下有以下三种办法:

  • new Date().getTime()
  • new Date().valueOf()
  • Number(new Date())
  • Date.now():推荐,更高效,因为不用创建一个 Date 对象。

自动校准

自动校准是 Date 对象一个很有用的特性,当设置一个超出范围的值时,它会自动校准。

$$jsdemo$$
$$edit$$
let date = new Date(2022, 1, 40) // 2月40号会自动校准到下个月
alert(date) // Sat Mar 12 2022 00:00:00 GMT+0800 (香港标准时间),3月12号

这大大方便了我们的运算,因为我们经常需要求经常某段时间后的日期。

比如以下例子,求十天之后的日期,例子中我们不用考虑 setDate 后是否会溢出, Date 对象会自动帮我们校准。

$$jsdemo$$
$$edit$$
let date = new Date()

// 设置 10 天之后
date.setDate(date.getDate() + 10)

alert(date) // 十天之后的日期

日期差值

将两个 Date 对象相减时,得到的是以毫秒为单位的差值。

以下例子为求出生到现在所渡过的天数。

$$jsdemo$$
$$edit$$
let second = 1000
let minute = second * 60
let hour = minute * 60
let day = hour * 24

let birthday = new Date(1993, 8, 31) // 出生的日子
let diff = new Date() - birthday // 与现在的差值,毫秒

alert(`我在这世上活了${Math.floor(diff / day)}天`)

练习

1.知道你出生那天是周几吗?用 Date 对象计算出来。