JavaScript基础语法
第六部分 日期和时间
1、创建
new Date()
不带参数,——创建一个表示当前日期的对象
let now = new Date();
alert( now ); //Mon Oct 31 2022 18:40:12 GMT+0800 (中国标准时间)
new Date(milliseconds)
带参数,参数是时间戳,创建一个 Date 对象,输出从1970/1/1 8点整到经过这个毫秒值后的时间。
let Jan01_1970 = new Date(0);
alert( Jan01_1970 ); //Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)
// 现在增加 24 小时
let Jan02_1970 = new Date(24 * 3600 * 1000);
alert( Jan02_1970 ); //Fri Jan 02 1970 08:00:00 GMT+0800 (中国标准时间)
new Date(datestring)
参数是字符串,参数被自动解析
let date = new Date("2017-01-26");
alert(date); //Thu Jan 26 2017 08:00:00 GMT+0800 (中国标准时间)
//未指定具体时间,代码的运行结果可能与时区有关
new Date(year, month, date, hours, minutes, seconds, ms)
使用当前时区中给定组件创建日期,只有前2个参数是必须的。
- year:4位数, eg:1998
- month: 范围从0到11, 即1月到12月
- date:当月具体的某一天,默认为1
- 如果 hours/minutes/seconds/ms 缺失,则均为默认值 0。
new Date(2011, 0, 1); // 1 Jan 2011, 00:00:00
//最大精确到1毫秒
let date = new Date(2011, 0, 1, 2, 3, 4, 567);
alert( date ); // 1.01.2011, 02:03:04.567
2、访问日期组件
getFullYear()
获取年份(4 位数)getMonth()
获取月份,从 0 到 11。getDate()
获取当月的具体日期,从 1 到 31。getHours(),getMinutes(),getSeconds(),getMilliseconds()
获取相应的时间。getDay()
获得一周中的第几天,从0(周日)到6(周六)。
以上的所有方法返回的组件都是基于当地时区的。getTime()
返回日期的时间戳 —— 从 1970-1-1 00:00:00 UTC+0 开始到现在所经过的毫秒数。getTimezoneOffset()
返回 UTC(世界统一时间) 与本地时区之间的时差,以分钟为单位。
3、设置日期组件
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)(使用自 1970-01-01 00:00:00 UTC+0 以来的毫秒数来设置整个日期)
//例如:
let today = new Date();
today.setHours(0);
alert(today); // 日期依然是今天,但是小时数被改为了 0
today.setHours(0, 0, 0, 0);
alert(today); // 日期依然是今天,时间为 00:00:00。
4、自动校准
如果设置了超时间范围的数值,超出范围的日期会被自动分配。
//创建日期 2016-2-28
let date = new Date(2016, 1, 28);
date.setDate(date.getDate() + 2);
//是否闰年也不需要考虑,Date会帮我们处理
alert( date ); // 1 Mar 2016
//这个特性常被用来获取给定时间段后的日期,
//获取70秒后的日期
let date = new Date();
date.setSeconds(date.getSeconds() + 70);
alert( date ); // Mon Oct 31 2022 19:48:49 GMT+0800 (中国标准时间)
//还可以设置为0甚至是负数
let date = new Date(2016, 0, 2); // 2016 年 1 月 2 日
date.setDate(1); // 设置为当月的第一天
alert( date );
date.setDate(0); // 天数最小可以设置为 1,所以这里设置的是上一月的最后一天
alert( date ); // 31 Dec 2015
5、日期转化为数字、日期差值
let date = new Date();
//日期转化为数字,得到的是对应的时间戳
alert(+date); // 以毫秒为单位的数值,与使用 date.getTime() 的结果相同
//这个作用可以用于时间测量:
let start = new Date(); // 开始测量时间
// do the job
for (let i = 0; i < 100000; i++) {
let doSomething = i * i * i;
}
let end = new Date(); // 结束测量时间
alert( `The loop took ${end - start} ms` );
如果仅仅想获取时间戳,有一个特殊的方法Date.now(),它会返回当前时间戳,相当于 new Date().getTime(),Date.now()不需要创建Date对象,性能更好
6、基准测试
在对一个很耗 CPU 性能的函数进行可靠的基准测试(Benchmarking)时,例如,我们想判断以下两个计算日期差值的函数哪个更快?这种性能测量通常称为“基准测试(benchmark)”。
// 我们有 date1 和 date2,哪个函数会更快地返回两者的时间差?
function diffSubtract(date1, date2) {
return date2 - date1;
}
// or
function diffGetTime(date1, date2) {
return date2.getTime() - date1.getTime();
}
7、Date.parse
Date.parse(str)
方法可以从一个字符串中读取日期。
字符串的格式应该为:YYYY-MM-DDTHH:mm:ss.sssZ,其中:
- YYYY-MM-DD —— 日期:年-月-日。
- 字符 “T” 是一个分隔符。
- HH:mm:ss.sss —— 时间:小时,分钟,秒,毫秒。
- 可选字符 ‘Z’ 为 ±hh:mm 格式的时区。单个字符 Z 代表 UTC+0 时区。
简短形式也是可以的,比如 YYYY-MM-DD 或 YYYY-MM,甚至可以是 YYYY。
Date.parse(str)
调用会解析给定格式的字符串,并返回时间戳(自 1970-01-01 00:00:00 起所经过的毫秒数)。如果给定字符串的格式不正确,则返回 NaN。
let ms = Date.parse('2012-01-26T13:51:50.417-07:00');
alert(ms); // 1327611110417 (时间戳)
可以根据时间戳再创建一个日期对象:
let date = new Date( Date.parse('2012-01-26T13:51:50.417-07:00') );
alert(date);