--- title: Date slug: Web/JavaScript/Reference/Global_Objects/Date tags: - Date - JavaScript - 日期 - 时间 translation_of: Web/JavaScript/Reference/Global_Objects/Date ---
{{JSRef}}
创建一个 JavaScript Date
实例,该实例呈现时间中的某个时刻。Date
对象则基于 Unix Time Stamp,即自1970年1月1日(UTC)起经过的毫秒数。
new Date(); new Date(value); new Date(dateString); new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);
创建一个新Date
对象的唯一方法是通过{{jsxref("Operators/new", "new")}} 操作符,例如:let now = new Date();
若将它作为常规函数调用(即不加 {{jsxref("Operators/new", "new")}} 操作符),将返回一个字符串,而非 Date
对象。
Date()
构造函数有四种基本形式
如果没有提供参数,那么新创建的Date对象表示实例化时刻的日期和时间。
value
dateString
注意: 由于浏览器之间的差异与不一致性,强烈不推荐使用Date
构造函数来解析日期字符串 (或使用与其等价的Date.parse
)。对 RFC 2822 格式的日期仅有约定俗称的支持。 对 ISO 8601 格式的支持中,仅有日期的串 (例如 "1970-01-01") 会被处理为 UTC 而不是本地时间,与其他格式的串的处理不同。
当至少提供了年份与月份时,这一形式的 Date()
返回的 Date
对象中的每一个成员都来自下列参数。没有提供的成员将使用最小可能值(对日期为1
,其他为0
)。
year
monthIndex
hours
{{optional_inline}}minutes
{{optional_inline}}seconds
{{optional_inline}}milliseconds
{{optional_inline}}注意 参数monthIndex
是从“0”开始计算的,这就意味着一月份为“0”,十二月份为“11”。
注意:当Date作为构造函数调用并传入多个参数时,如果数值大于合理范围时(如月份为 13 或者分钟数为 70),相邻的数值会被调整。比如 new Date(2013, 13, 1)等于new Date(2014, 1, 1),它们都表示日期2014-02-01(注意月份是从0开始的)。其他数值也是类似,new Date(2013, 2, 1, 0, 70)等于new Date(2013, 2, 1, 1, 10),都表示同一个时间:2013-03-01T01:10:00
。
注意:当Date作为构造函数调用并传入多个参数时,所定义参数代表的是当地时间。如果需要使用世界协调时 UTC,使用 new Date({{jsxref("Date.UTC()", "Date.UTC(...)")}})
和相同参数。
Date
对象的范围是 -100,000,000 天至 100,000,000 天(等效的毫秒值)。Date
对象为跨平台提供了统一的行为。时间属性可以在不同的系统中表示相同的时刻,而如果使用了本地时间对象,则反映当地的时间。Date
对象支持多个处理 UTC 时间的方法,也相应地提供了应对当地时间的方法。UTC,也就是我们所说的格林威治时间,指的是time中的世界时间标准。而当地时间则是指执行JavaScript的客户端电脑所设置的时间。Date
对象(即不使用 {{jsxref("Operators/new", "new")}} 操作符)会返回一个代表当前日期和时间的字符串。Date
对象添加属性。Date.length
Date.length
的值是 7。这是该构造函数可接受的参数个数。注意: 由于浏览器差异和不一致,强烈建议不要使用Date.parse
解析字符串。
Date
实例所有的 Date
实例都继承自 {{jsxref("Date.prototype")}}。修改 Date
构造函数的原型对象会影响到所有的 Date
实例。
Date.prototype.constructor
{{ page("/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/prototype", "Methods") }}
下例展示了用来创建一个日期对象的多种方法。
注意: 由于浏览器差异和不一致性,强烈建议不要使用Date
构造函数(和Date.parse
,它们是等效的)解析日期字符串。
var today = new Date(); var birthday = new Date('December 17, 1995 03:24:00'); var birthday = new Date('1995-12-17T03:24:00'); var birthday = new Date(1995, 11, 17); var birthday = new Date(1995, 11, 17, 3, 24, 0);
为了创建和获取 0 到 99 之间的年份,应使用 {{jsxref("Date.prototype.setFullYear()")}} 和 {{jsxref("Date.prototype.getFullYear()")}} 方法。
var date = new Date(98, 1); // Sun Feb 01 1998 00:00:00 GMT+0000 (GMT) // 已弃用的方法, 同样将 98 映射为 1998 date.setYear(98); // Sun Feb 01 1998 00:00:00 GMT+0000 (GMT) date.setFullYear(98); // Sat Feb 01 0098 00:00:00 GMT+0000 (BST)
下例展示了如何以毫秒精度计算两个日期对象的时间差:
由于不同日期、月份、年份长度的不同(日期长度不同来自夏令时的切换),使用大于秒、分钟、小时的单位表示经过的时间会遇到很多问题,在使用前需要经过详尽的调研。
// 使用 Date 对象 var start = Date.now(); // 调用一个消耗一定时间的方法: doSomethingForALongTime(); var end = Date.now(); var elapsed = end - start; // 以毫秒计的运行时长
// 使用内建的创建方法 var start = new Date(); // 调用一个消耗一定时间的方法: doSomethingForALongTime(); var end = new Date(); var elapsed = end.getTime() - start.getTime(); // 运行时间的毫秒值
// to test a function and get back its return function printElapsedTime (fTest) { var nStartTime = Date.now(), vReturn = fTest(), nEndTime = Date.now(); alert("Elapsed time: " + String(nEndTime - nStartTime) + " milliseconds"); return vReturn; } yourFunctionReturn = printElapsedTime(yourFunction);
注意:在支持 {{domxref("window.performance", "Web Performance API")}} 的高精细度(high-resolution)时间功能的浏览器中,{{domxref("Performance.now()")}} 提供的所经过的时间比 {{jsxref("Date.now()")}} 更加可靠、精确。
var seconds = Math.floor(Date.now() / 1000);
注意此处需要返回一个整数 (仅做除法得到的不是整数),并且需要返回实际已经经过的秒数(所以这里使用了{{jsxref("Math.floor()")}}而不是{{jsxref("Math.round()")}}).
规范版本 | 规范状态 | 注解 |
---|---|---|
{{SpecName('ESDraft', '#sec-date-objects', 'Date')}} | {{Spec2('ESDraft')}} | |
{{SpecName('ES6', '#sec-date-objects', 'Date')}} | {{Spec2('ES6')}} | |
{{SpecName('ES5.1', '#sec-15.9', 'Date')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES1')}} | {{Spec2('ES1')}} | Initial definition. Implemented in JavaScript 1.1. |
{{Compat("javascript.builtins.Date")}}