JavaScript Date 对象完全指南:构造函数、静态方法与日期处理陷阱

作者:小括号

时间:2026-10-30

浏览:385

本文深入解析 JavaScript 中的 Date 对象,涵盖五种构造函数用法、静态方法 Date.parse 与 Date.UTC 的区别,以及 get/set 系列时间操作。重点讨论 ECMAScript 5 新增的 Date.now(),并详细剖析不同浏览器对日期字符串解析的差异及兼容性解决方案,提供标准化日期处理的最佳实践。

文章目录

Date 对象构造函数与初始化

创建 Date 对象有多种语法形式,具体取决于传入参数的类型。

代码如下:

//Date 对象会自动把当前日期和时间保存为其初始值。
new Date();
//value-毫秒:代表自世界协调时1970年1月1日00:00:00开始的数值。
new Date(value);
//dateString-日期字符串:表示日期的字符串值。此字符串应该是在parse方法中识别的格式。
new Date(dateString);
//year-年:代表年份的整数值。为了避免2000年问题最好指定4位数的年份; 使用1998, 而不要用98
//month-月:代表月份的整数值从0(1月)到11(12月)
//day-日:代表一个月中的第几天的整数值,从1开始
//hour-小时:代表一天中的小时数的整数值 (24小时制)
//minute-分钟
//second-秒
//millisecond-毫秒
new Date(year, month, day [, hour, minute, second, millisecond]);

Date() 函数与静态解析方法

Date() 函数

直接调用 Date() 函数(不带 new 关键字)会返回当前日期的字符串表示。

代码如下:

console.log(Date()); //"Tue Sep 17 2013 12:22:55 GMT+0800 (中国标准时间)"

parse() 方法

Date.parse() 用于解析日期时间字符串,返回自 1970 年 1 月 1 日午夜(本地时区)至该日期的毫秒数。

Date.parse(datestring)

参数 datestring 是必需的,表示日期和时间的字符串。

注意,该方法是 Date 对象的静态方法。一般采用 Date.parse() 的形式来调用,而不是通过 dateobject.parse() 调用该方法。

代码如下:

console.log(Date.parse(Date())); //1379392301000
console.log(Date.parse("Aug 9, 1995")); //807897600000

UTC 时间与本地时区的区别

UTC() 方法

Date.UTC() 根据世界时(UTC/GMT)返回自 1970 年 1 月 1 日至今的毫秒数。

Date.UTC(year, month, day, hours, minutes, seconds, ms)

参数 year 是必需的,表示年份的四位数字;month 是必需的,表示月份的整数,介于 0 ~ 11;day 是可选的,表示日期的整数,介于 1 ~ 31;hours 是可选的,表示小时的整数,介于 0 ~ 23;minutes 是可选的,表示分钟的整数,介于 0 ~ 59;seconds 是可选的,表示秒的整数,介于 0 ~ 59;ms 是可选的,表示毫秒的整数,介于 0 ~ 999。

Date.UTC() 是一种静态方法。Date.UTC() 方法的参数指定日期和时间,它们都是 UTC 时间,处于 GMT 时区。指定的 UTC 时间将转换成毫秒的形式,这样构造函数 Date() 和方法 Date.setTime() 就可以使用它了。

ECMAScript 中的 Date 类型是早期 Java 中的 Java.util.Date 类基础上构建的。为此,Date 类型使用来自 UTC(Coordinated Universal Time,国际协调时间)1970 年 1 月 1 日午夜(零时)开始经过的毫秒数来保存日期。在使用这种数据存储格式的条件下,Date 类型保存的日期能够精确到 1970 年 1 月 1 日之前或之后的 285616 年。

注意:parse() 日期和时间都基于本地时区而非 GMT 来创建。而 UTC() 是基于 GMT 来创建。他们的参数也不相同。

GMT:世界时,即格林尼治所在地的标准时间。

代码如下:

var d = new Date();
console.log(Date.parse(d)); //1379393562000
console.log(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds())); //1379422362020

获取当前时间戳:Date.now()

ECMAScript 5 添加了 Date.now() 方法,返回表示调用这个方法时的日期和时间的毫秒数。IE9 才开始支持,不过我们可以通过 + 操作符来把 Date 对象转换成字符串,得到同样的值。

代码如下:

var d1 = Date.now();
var d2 = + new Date();
console.log(d1); //1379393793104
console.log(d2); //1379393793104

浏览器日期解析兼容性与最佳实践

JavaScript 中的日期转换行为在不同浏览器中表现各异,且受参数格式影响较大,例如:

代码如下:

var d1 = new Date("2012/03/13");
var d2 = new Date("2012-03-13");
var d3 = new Date("2012-3-13");
console.log(d1); //Tue Mar 13 2012 00:00:00 GMT+0800 (中国标准时间)
console.log(d2); //Tue Mar 13 2012 08:00:00 GMT+0800 (中国标准时间)
console.log(d3); //Tue Mar 13 2012 00:00:00 GMT+0800 (中国标准时间)

在不同浏览器中的表现参考:http://dygraphs.com/date-formats.html

为了避免这些问题,请遵照下面的建议:

1.坚持使用 ”YYYY/MM/DD” 的日期字符串格式 2.避免使用带有连字号的日期字符串格式”YYYY-MM-DD” 3.要指定四位数的年份 4.Chrome 浏览器的比其他浏览器能接受更多的日期字符串,所以如果在 Chrome 浏览器没有问题,不代表其他浏览器没有问题

更多信息可以参考:JavaScript and Dates, What a Mess!和 SO 中的讨论

获取与设置时间组件

get 系列方法

getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31)。 getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6)。 getMonth() 从 Date 对象返回月份 (0 ~ 11)。 getFullYear() 从 Date 对象以四位数字返回年份。注意不要使用 getYear()。 getHours() 返回 Date 对象的小时 (0 ~ 23)。 getMinutes() 返回 Date 对象的分钟 (0 ~ 59)。 getSeconds() 返回 Date 对象的秒数 (0 ~ 59)。 getMilliseconds() 返回 Date 对象的毫秒(0 ~ 999)。 getTime() 返回 1970 年 1 月 1 日至今的毫秒数。 getTimezoneOffset() 返回本地时间与格林威治标准时间 (GMT) 的分钟差。 getUTCDate() 根据世界时从 Date 对象返回月中的一天 (1 ~ 31)。 getUTCDay() 根据世界时从 Date 对象返回周中的一天 (0 ~ 6)。 getUTCMonth() 根据世界时从 Date 对象返回月份 (0 ~ 11)。 getUTCFullYear() 根据世界时从 Date 对象返回四位数的年份。 getUTCHours() 根据世界时返回 Date 对象的小时 (0 ~ 23)。 getUTCMinutes() 根据世界时返回 Date 对象的分钟 (0 ~ 59)。 getUTCSeconds() 根据世界时返回 Date 对象的秒钟 (0 ~ 59)。 getUTCMilliseconds() 根据世界时返回 Date 对象的毫秒(0 ~ 999)。

set 系列方法

setDate() 设置 Date 对象中月的某一天 (1 ~ 31)。 setMonth() 设置 Date 对象中月份 (0 ~ 11)。 setFullYear() 设置 Date 对象中的年份(四位数字)。注意不要使用 setYear() 方法。 setHours() 设置 Date 对象中的小时 (0 ~ 23)。 setMinutes() 设置 Date 对象中的分钟 (0 ~ 59)。 setSeconds() 设置 Date 对象中的秒钟 (0 ~ 59)。 setMilliseconds() 设置 Date 对象中的毫秒 (0 ~ 999)。 setTime() 以毫秒设置 Date 对象。 setUTCDate() 根据世界时设置 Date 对象中月份的一天 (1 ~ 31)。 setUTCMonth() 根据世界时设置 Date 对象中的月份 (0 ~ 11)。 setUTCFullYear() 根据世界时设置 Date 对象中的年份(四位数字)。 setUTCHours() 根据世界时设置 Date 对象中的小时 (0 ~ 23)。 setUTCMinutes() 根据世界时设置 Date 对象中的分钟 (0 ~ 59)。 setUTCSeconds() 根据世界时设置 Date 对象中的秒钟 (0 ~ 59)。 setUTCMilliseconds() 根据世界时设置 Date 对象中的毫秒 (0 ~ 999)。

日期字符串转换方法

toString 系列方法

toString() 把 Date 对象转换为字符串,toString() 总是返回一个用美式英语表达的字符串。 toTimeString() 把 Date 对象的时间部分转换为字符串。 toDateString() 把 Date 对象的日期部分转换为字符串。 toUTCString() 根据世界时,把 Date 对象转换为字符串。 toLocaleString() 根据本地时间格式,把 Date 对象转换为字符串。 toLocaleTimeString() 根据本地时间格式,把 Date 对象的时间部分转换为字符串。 toLocaleDateString() 根据本地时间格式,把 Date 对象的日期部分转换为字符串。

代码如下:

var d = new Date();
console.log(d); //Tue Sep 17 2013 13:37:04 GMT+0800 (中国标准时间)
console.log(d.toString()); //Tue Sep 17 2013 13:37:04 GMT+0800 (中国标准时间)
console.log(d.toTimeString()); //13:37:04 GMT+0800 (中国标准时间)
console.log(d.toDateString() ); //Tue Sep 17 2013
console.log(d.toUTCString()); //Tue, 17 Sep 2013 05:37:04 GMT
console.log(d.toLocaleString()); //2013年9月17日 下午1:37:04
console.log(d.toLocaleTimeString()); //下午1:37:04
console.log(d.toLocaleDateString()); //2013年9月17日

注意 toLocaleString() 系列方法可以接收参数,来确定按照什么习惯来输出,参考:MDN

代码如下:

var d = new Date();
console.log(d.toLocaleString("ko-KR")); //2013년 9월 17일 오후 1:48:24

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章