ECMAScript的Date类型参考了Java早期版本中的java.util.Date。为此,Date类型将日期保存为自协调世界时(UTC, Universal Time Coordinated)时间1970年1月1日午夜(零时)至今所经过的毫秒数。使用这种存储格式,Date类型可以精确表示1970年1月1日之前及之后285616年的日期。
要创建日期对象,可以使用new操作符调用Date构造函数:
new Date() //Thu Dec 08 2022 10:27:45 GMT+0800 (中国标准时间)
在不给Date构造函数传递参数的时候,创建的对象将保存当前日期和时间。
ECMAScript提供了Date.parse()方法,该方法接收一个表示日期的字符串参数,尝试将这个字符串转换为表示该日期的毫秒数。ECMA-262第5版定义了Date.parse()应该支持的日期格式,填充了第3版遗留的空白。所有实现都必须支持下列日期格式:
- “月/日/年”,如"5/23/2019";
- “月名日,年”,如"May 23, 2019";
- “周几 月名 日 年 时:分:秒 时区”,如"Tue May 232019 00:00:00GMT-0700";
- ISO 8601扩展格式“YYYY-MM-DDTHH:mm:ss.sssZ”,如2019-05-23T00:00:00(只适用于兼容ES5的实现)。
//创建一个表示“2019年5月23日”的日期对象
let someDate = new Date(Date.parse("May 23, 2019")); // Thu May 23 2019 00:00:00 GMT+0800 (中国标准时间)
//创建一个表示“2022年12月08日”的日期对象
new Date(Date.parse("2022/12/08")) //Thu Dec 08 2022 00:00:00 GMT+0800 (中国标准时间)
Date.parse() //没有传入字符串或传入的字符串不表示日期,返回NaN
如果传给Date.parse()的字符串并不表示日期,则该方法会返回NaN。
ECMAScript还提供了Date.now()方法,返回表示方法执行时日期和时间的毫秒数。
Date.now() //1670467176542
继承的方法
与其他类型一样,Date类型重写了toLocaleString()、toString()和valueOf()方法。但与其他类型不同,重写后这些方法的返回值不一样。
toLocaleString和toString
Date类型的toLocaleString()方法返回与浏览器运行的本地环境一致的日期和时间。这通常意味着格式中包含针对时间的AM(上午)或PM(下午),但不包含时区信息(具体格式可能因浏览器而不同)。toString()方法通常返回带时区信息的日期和时间,而时间也是以24小时制(0~23)表示的。
new Date().toLocaleString() // '2022/12/8 10:44:51'
// 通常返回带时区信息的日期和时间
new Date().toString() //'Thu Dec 08 2022 10:45:01 GMT+0800 (中国标准时间)'
valueOf
Date类型的valueOf()方法根本就不返回字符串,这个方法被重写后返回的是日期的毫秒表示。
//返回日期的毫秒表示
new Date().valueOf() //1670467662820
let date1 = new Date(2022, 0, 1); // 2022年1月1日
let date2 = new Date(2022, 1, 1); // 2022年2月1日
console.log(date1 < date2); // true
console.log(date1 > date2); // false
日期格式化方法
Date类型有几个专门用于格式化日期的方法,它们都会返回字符串:
toDateString()显示日期中的周几、月、日、年(格式特定于实现);
toTimeString()显示日期中的时、分、秒和时区(格式特定于实现);
toLocaleDateString()显示日期中的周几、月、日、年(格式特定于实现和地区);
toLocaleTimeString()显示日期中的时、分、秒(格式特定于实现和地区);
toUTCString()显示完整的UTC日期(格式特定于实现)。
这些方法的输出与toLocaleString()和toString()一样,会因浏览器而异。因此不能用于在用户界面上一致地显示日期。
//显示日期中的周几、月、日、年(格式特定于实现)
new Date().toDateString() // 'Thu Dec 08 2022'
//显示日期中的时、分、秒和时区(格式特定于实现)
new Date().toTimeString() //'10:52:41 GMT+0800 (中国标准时间)'
//显示日期中的年、月、日(格式特定于实现和地区)
new Date().toLocaleDateString() // '2022/12/8'
//显示日期中的时、分、秒(格式特定于实现和地区)
new Date().toLocaleTimeString() '10:53:08'
日期/时间组件方法
Date(): 返回当日的日期和时间;getDate(): 从Date对象返回一个月中的某一天(1~31);getDay():从Date对象返回一周中的某一天(0~6);getMonth(): 从Date对象返回月份(0~11);getFullYear(): 从Date对象以四位数字返回年份;getYear():可以使用getFullYear()代替;getHours(): 返回Date()对象的小时(0~23);getMinutes(): 返回Date()对象的分钟(0~59);getSeconds(): 返回Date()对象的分钟(0~59);getMillseconds(): 返回Date()对象的毫秒(0~999);getTime(): 返回1970年1月1日至今的时间;getTimezoneOffset(): 返回本地时间与格林威治标准时间(GMT)的分钟差;getUTCDate(): 根据世界时从Date对象返回月中的一天(1~31);getUTCDay(): 根据世界时从Date对象返回周中的一天(1~6);getUTCMonth(): 根据世界时从Date对象返回月份(0~11);getUTCFullYear(): 根据世界时从Date对象返回四位数的年份;getUTCHours(): 根据世界时从Date对象返回对象的小时(0~23);getUTCMinutes(): 根据世界时从Date对象返回对象的分钟(0~59);getUTCSeconds(): 根据世界时从Date对象返回对象的秒钟(0~59);getUTCMillseconds(): 根据世界时从Date对象返回对象的毫秒(0~999);parse(): 返回1970年1月1日午夜到指定日期(字符串)的毫秒数;setDate(): 设置Date对象中月的某一天(1~31);setMonth(): 设置Date对象中月份(0~11);setFullYear(): 设置Date对象中的年份(四位数字);