JavaScript 基础
Document
运算符
深入数据和类型
函数进阶
原型、继承
类
浏览器存储
Web API
事件
错误处理
异步编程
网络请求
模块
练习
实例
工具与规范
软件架构模式
设计模式
日期
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$$
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)}天`)
练习
- 知道你出生那天是周几吗?用
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()}分时检验结果。`
)
$$
- 小明放暑假是在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}天`)
$$