一、Date对象简介
Date 对象用于处理日期和时间。
1.Date对象的创建
Date 对象会自动把当前日期和时间保存为其初始值。注意当前日期和时间是指创建date对象那个时间点的时间。date对象创建后,它保存的时间并不会变化。
let date = new Date() // Date 对象会自动把当前日期和时间保存为其初始值。
console.log(date);
setTimeout(() => {
console.log(new Date())
console.log(date);
}, 3000)
二、Date对象方法
1. get方法
Date对象的get方法主要用于获取Date对象的时间。
get方法中有get和getUTC两种,其中getUTC是根据世界时间获取,也就是所谓的格林威治时间。比中国的北京时间要慢8小时。
下方代码运行结果图:
(1)getMilliseconds()
getMilliseconds():返回 Date 对象的毫秒(0 ~ 999)。
let date = new Date()
console.log(Date());
console.log(date.getMilliseconds() + '毫秒'); // 毫秒
console.log(date.getUTCMilliseconds() + '毫秒'); // 毫秒
(2)getSeconds()
getSeconds():返回 Date 对象的秒数 (0 ~ 59)。
let date = new Date()
console.log(Date());
console.log(date.getSeconds() + '秒'); // 秒
console.log(date.getUTCSeconds() + '秒'); // 秒
(3)getMinutes()
getMinutes():返回 Date 对象的分钟 (0 ~ 59)。
let date = new Date()
console.log(Date());
console.log(date.getMinutes() + '分'); // 分
console.log(date.getUTCMinutes() + '分'); // 分
(4)getHours()
getHours():返回 Date 对象的小时 (0 ~ 23)。
let date = new Date()
console.log(Date());
console.log(date.getHours() + '时'); // 时
console.log(date.getUTCHours() + '时'); // 时
(5)getDate()
getDate():从 Date 对象返回一个月中的某一天 (1 ~ 31)。
let date = new Date()
console.log(Date());
console.log(date.getDate() + '日'); // 日
console.log(date.getUTCDate() + '日'); // 日
(6)getDay()
getDay():从 Date 对象返回一周中的某一天 (0 ~ 6)。
let date = new Date()
console.log(Date());
console.log('周' + date.getDay()); // 周几
console.log('周' + date.getUTCDay()); // 周几
(7)getMonth()
getMonth():从 Date 对象返回月份 (0 ~ 11)。
let date = new Date()
console.log(Date());
console.log(date.getMonth() + '月'); // 月
console.log(date.getUTCMonth() + '月'); // 月
(8)getFullYear()
getFullYear():从 Date 对象以四位数字返回年份。
let date = new Date()
console.log(Date());
console.log(date.getFullYear() + '年'); // 年
console.log(date.getUTCFullYear() + '年'); // 年
(9)getTime()
getTime():返回 1970 年 1 月 1 日至今的毫秒数。
let date = new Date()
console.log(Date());
console.log(date.getTime()); // 返回 1970 年 1 月 1 日至今的毫秒数。
(10)getTimezoneOffset()
getTimezoneOffset():返回本地时间与格林威治标准时间 (GMT) 的分钟差。
let date = new Date()
console.log(Date());
console.log(date.getTimezoneOffset()); // 返回本地时间与格林威治标准时间 (GMT) 的分钟差。
2. set方法
Date对象的方法主要用于设置Date对象的时间。
主要的使用场景是计算日期,比如要获取当前日期30天后的具体日期。如果我们手动加的话,因为每月的具体天数不同,比较麻烦,我们可以通过设置日期的方法解决,在本小结的结尾会具体举例。
下列方法具体执行结果:
(1)setMilliseconds()
setMilliseconds(number):设置 Date 对象中的毫秒 (0 ~ 999)。
let date = new Date()
console.log(date);
date.setMilliseconds(1); // 毫秒
console.log(date.getMilliseconds());
(2)setseconds()
setseconds(number):设置 Date 对象中的秒钟 (0 ~ 59)。
let date = new Date()
console.log(date);
date.setSeconds(1); // 秒
console.log('设置秒' + date);
(3)setMinutes()
setMinutes(number):设置 Date 对象中的分钟 (0 ~ 59)。
let date = new Date()
console.log(date);
date.setMinutes(1); // 分
console.log('设置分' + date);
(4)setHours()
setHours(number):设置 Date 对象中的小时 (0 ~ 23)。
let date = new Date()
console.log(date);
date.setHours(1); // 时
console.log('设置时' + date);
(5)setDate()
setDate(number):设置 Date 对象中月的某一天 (1 ~ 31)。
let date = new Date()
console.log(date);
date.setDate(1); // 日
console.log('设置日' + date);
(6)setMonth()
setMonth(number):设置 Date 对象中月份 (0 ~ 11)。
let date = new Date()
console.log(date);
date.setMonth(1); // 月
console.log('设置月' + date);
(7)setFullYear()
setFullYear(number):设置 Date 对象中的年份(四位数字)。
let date = new Date()
console.log(date);
date.setFullYear(1998); // 年
console.log('设置年' + date);
(8)使用场景
set方法常被用在计算当前时间点后n天的具体日期,具体实现如下:
let d = new Date()
console.log('当前日期:' + d.toLocaleString());
d.setDate(d.getDate() + 30) // 获取30天之后的具体日期
console.log('转换日期:' + d.toLocaleString());
在这里只拿‘天’举例,其他如‘分’、‘秒’、‘年’、‘月’等等道理相同。
3. to方法
Date对象的to方法是将Date对象转换为字符串的方法。
下面代码的执行结果图:
(1)toTimeString()
toTimeString():把 Date 对象的时间部分转换为字符串。
let date = new Date()
console.log(date.toTimeString()); // 把 Date 对象的时间部分转换为字符串。
(2)toDateString()
toDateString():把 Date 对象的日期部分转换为字符串。
let date = new Date()
console.log(date.toDateString()); // 把 Date 对象的日期部分转换为字符串。
(3)toString()
toString():把 Date 对象转换为字符串。
let date = new Date()
console.log(date.toString()); // 把 Date 对象转换为字符串。
(4)toLocaleTimeString()
toLocaleTimeString():根据本地时间格式,把 Date 对象的时间部分转换为字符串。
let date = new Date()
console.log(date.toLocaleTimeString()); // 根据本地时间格式,把 Date 对象的时间部分转换为字符串。
(5)toLocaleDateString()
toLocaleDateString():根据本地时间格式,把 Date 对象的日期部分转换为字符串
console.log(date.toLocaleDateString()); // 根据本地时间格式,把 Date 对象的日期部分转换为字符串。
(6)toLocaleString()
toLocaleString():根据本地时间格式,把 Date 对象转换为字符串。
let date = new Date()
console.log(date.toLocaleString()); // 根据本地时间格式,把 Date 对象转换为字符串。
4. 其他方法
(1)valueOf()
valueOf():返回 Date 对象的原始值。(即:时间戳,和getTime()方法结果相同
let date = new Date()
console.log('valueOf:' + date.valueOf());
console.log('getTime:' + date.getTime());
(2)parse()
parse(dateString):返回1970年1月1日午夜(该日期对象的UTC时间)到指定日期(字符串)的毫秒数。
dateString:
一个符合 RFC2822 或 ISO 8601 日期格式的字符串。
例如:
RFC2822标准:Apr 06 2021 17:00:00 GMT
或Apr 06 2021 17:00:00 GMT+0430
(格林威治的子午线向东偏移4小时30分钟)如果没有指定时区,默认使用本地时区。
ISO 8601标准:2021-04-06
(仅日期)或 2021-04-06T17:00:00
(其他格式也许也支持,但结果可能与预期不符)。
**注意:**parse()方法是返回当前日期到1970年1月1日午夜的UTC时间。(UTC时间与GMT时间相同,都是格林威治标准时间)
let time1 = Date.parse('Apr 06 2021 17:00:00 GMT+0800')
console.log(time1);
let time2 = Date.parse('2021-04-06T17:00:00')
console.log(time2);
let formatDate1 = new Date('Jan 01 1970 00:00:00 UTC') // 是到1970年1月1日午夜的UTC时间,所以要标明UTC或者GMT,不表明会默认为当前时区时间,也就是东八区
let formatDate2 = new Date('Jan 01 1970 00:00:00')
formatDate1.setMilliseconds(formatDate1.getMilliseconds() + time1) // 获取1970年1月1日午夜的UTC时间加上Date.parse()方法的毫秒值,看是否与我们格式化的时间相同
console.log('UTC时间' + formatDate1.toLocaleString());
formatDate2.setMilliseconds(formatDate2.getMilliseconds() + time1)
console.log('当前时区时间' + formatDate2.toLocaleString()); // 不按照UTC时间初始化 1970-1-1 00:00:00 日期对象的话,会慢八小时,因为是默认按照东八区时间进行初始化
举个更明显的例子:
let date1 = new Date('Jan 01 1970 00:00:00 UTC')
let date2 = new Date('Jan 01 1970 00:00:00')
let time1 = Date.parse('Jan 01 1970 00:00:00 UTC') // 按UTC时间进行转换,毫秒数为0
let time2 = Date.parse('Jan 01 1970 00:00:00') // 按东八区时间进行转换,毫秒数为-28800000(负八小时)
console.log(time1);// 0
console.log(time2);// -28800000
date1.setMilliseconds(date1.getMilliseconds() + time1)//date1和time1均为UTC时间,但是还是比我们初始化的时间快8小时,因为浏览器在输出时间时默认转换为东八区时间,也就是当前世界时间为:Jan 01 1970 00:00:00 UTC,但是东八区要加上八小时:Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)
console.log('UTC时间:' + date1.toString()); // UTC时间:Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)
date2.setMilliseconds(date2.getMilliseconds() + time1) // date2为东八区时间,time1为标准时间,与我们初始值相同。因为浏览器在输出时间时就是按照东八区时间输出
console.log('非UTC时间:' + date2.toString()); // 非UTC时间:Thu Jan 01 1970 00:00:00 GMT+0800 (中国标准时间)
date1.setMilliseconds(date1.getMilliseconds() + time2) // date1为UTC时间,time2按照东八区时间进行转换,与我们初始值相同。
console.log('UTC时间:' + date1.toString()); // UTC时间:Thu Jan 01 1970 00:00:00 GMT+0800 (中国标准时间)
date2.setMilliseconds(date2.getMilliseconds() + time2) // date2已经是东八区时间,time2又按照东八区时间进行转换,最后得到的比我们初始值慢8小时。因为date2按照东八区进行初始化,那么世界时间就-8小时,time2又按照东八区时间进行转换得到-28800000毫秒(负八小时),相加后就世界世界-16小时了。虽然最后浏览器按照东八区时间进行输出,也只是加8小时,最终结果还是慢8小时
console.log('非UTC时间:' + date2.toString()); // 非UTC时间:Wed Dec 31 1969 16:00:00 GMT+0800 (中国标准时间)
时间转换确实很绕,我自己也有点晕。以上仅是个人理解。如果理解有偏差还请轻喷。其实如果确实绕不过来也没关系,我们在开发过程中一般都是获取两个时间点的差值(例如:2021-04-06到2021-03-06之间的毫秒值),只要保持时间格式一致(均为UTC或者均为东八区)不论如何,两个时间点parse()得到的差值是相同的。开发过程中也可以自测一下,避免时间错误。