1. JavaScript 基础

  2. Document

  3. 运算符

  4. 深入数据和类型

  5. 函数进阶

  6. 原型、继承

  7. 浏览器存储

  8. Web API

  9. 事件

  10. 错误处理

  11. 异步编程

  12. 网络请求

  13. 模块

  14. 练习

  15. 实例

  16. 工具与规范

  17. 软件架构模式

  18. 设计模式

日期

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}天`)

$$