日期

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

image

设置日期与时间

以下方法可以设置时间。

  • 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$$
const SECOND = 1000
const MINUTE = SECOND * 60
const HOUR = MINUTE * 60
const DAY = HOUR * 24

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

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

练习

  1. 知道你出生那天是周几吗?用 Date 对象计算出来。 $$answer
$$jsdemo$$
$$edit$$
const birthday = new Date(1993, 7, 31) // 出生的日子,1993年8月31日

alert(`我出生那天是周${birthday.getDay() === 0 ? "日" : birthday.getDay()}`)

$$ 2. 现在是2022年8月10日16时35分,开始做菌落培养的实验,整个培养耗时92小时30分,请问要在什么时候检验实验结果。 $$answer

$$jsdemo$$
$$edit$$
// 2022年8月10日16时35分
let time = new Date(2022, 7, 10, 16, 35)

// 92小时30分后
time.setHours(time.getHours() + 92)
time.setMinutes(time.getMinutes() + 30)

alert(
    `在${time.getFullYear()}年${
        time.getMonth() + 1
    }月${time.getDate()}日${time.getHours()}时${time.getMinutes()}分时检验结果。`
)

$$

  1. 小明放暑假是在2022年7月5日,收假是在2022年8月30日,请问整个假期有多少天? $$answer
$$jsdemo$$
$$edit$$
// 放假 2022年7月5日
// 收假 2022年8月30日

const SECOND = 1000
const MINUTE = SECOND * 60
const HOUR = MINUTE * 60
const DAY = HOUR * 24

let start = new Date(2022, 7, 5)
let end = new Date(2022, 8, 30)

let diff = end - start
alert(`假期有${diff / DAY}天`)

$$