日期

基线 广泛可用

此功能已得到很好的建立,可在许多设备和浏览器版本中使用。从那时起,它就可以跨浏览器使用了 2015年7月.

JavaScript脚本日期对象以平台相关格式表示单个时刻。日期对象封装了一个整数,表示自1970年1月1日UTC(纪元).

注:TC39正在努力世俗的,一个新的日期/时间API。在上阅读有关它的更多信息Igalia博客。尚未准备好用于生产!

描述

纪元、时间戳和无效日期

JavaScript日期基本上指定为自纪元,定义为1970年1月1日凌晨UTC(相当于UNIX纪元). 此时间戳是时区不可知论者独特地定义了历史上的一个瞬间。

注:虽然Date对象的核心时间值是UTC,但获取日期和时间或其组件的基本方法都在本地(即主机系统)时区和偏移中工作。

表示的最大时间戳日期对象略小于最大安全整数(数量。最大安全整数,即9007199254740991)。A类日期对象可以代表相对于历元的最大±864000000000000毫秒或±100000000(一亿)天。这是从公元前271821年4月20日到公元275760年9月13日的范围。任何试图表示超出此范围的时间的尝试都会导致日期对象的时间戳值为NaN公司,这是一个“无效日期”。

js公司
console.log(new Date(8.64e15).toString());//“9月13日星期六275760 00:00:00 GMT+0000(协调世界时)”console.log(new Date(8.64e15+1).toString());//“无效日期”

有多种方法可用于与日期中存储的时间戳进行交互:

日期组件和时区

日期在内部表示为单个数字时间戳。与时间戳交互时,需要将时间戳解释为结构化的日期和时间表示。通常有两种方式来解释时间戳:作为本地时间或作为协调世界时(UTC),即世界时间标准定义的全球标准时间。本地时区不存储在日期对象中,而是由主机环境(用户的设备)确定。

注:UTC不应与格林威治标准时间(GMT),因为它们并不总是相等的,这在链接的维基百科页面中有更详细的解释。

例如,时间戳0表示历史中唯一的瞬间,但可以用两种方式解释:

  • 作为UTC时间,现在是1970年1月1日凌晨,UTC,
  • 作为纽约当地时间(UTC-5),现在是1969年12月31日19:00。

这个获取时区偏移()方法返回UTC和本地时间之间的差值(以分钟为单位)。请注意,时区偏移量不仅取决于当前时区,还取决于日期对象,因为夏令时和历史变化。本质上,时区偏移是从UTC时间开始的偏移,该时间由日期对象和主机环境的位置。

有两组日期方法:一组通过将时间戳解释为本地时间来获取和设置各种日期组件,而另一组使用UTC。

组件 本地 联合技术公司
获取 设置 获取 设置
年份 获取完整年() setFullYear() 获取UTCFullYear() setUTCFullYear()
月份 获取月份() 设置月份() 获取UTCMonth() 设置UTC月()
日期(月) 获取日期() 设置日期() 获取UTCDate() 设置UTCDate()
小时 获取小时() 设置小时() 获取UTCHours() 设置UTCHours()
会议记录 获取分钟() 设置分钟() 获取UTC分钟数() 设置UTC分钟()
获取秒() 设置秒() 获取UTC秒() 设置UTC秒()
毫秒 获取毫秒() 设置毫秒() 获取UTC毫秒() 设置UTC毫秒()
天(每周) 获取日期() 不适用 获取UTCDay() 不适用

这个日期()构造函数可以用两个或多个参数调用,在这种情况下,它们分别被解释为本地时间中的年、月、日、小时、分钟、秒和毫秒。日期。UTC()工作原理类似,但它将组件解释为UTC时间,并接受表示年份的单个参数。

注:一些方法,包括日期()构造函数,日期。UTC(),以及不推荐使用的获取年份()/设置年份()方法,将两位数的年份解释为20世纪的一年。例如,新日期(99,5,24)解释为1999年6月24日,而不是99年6月二十四日。请参见两位数年份的解释了解更多信息。

当一个段溢出或下溢其预期范围时,它通常“转入”或“借用”较高的段。例如,如果月份设置为12(月份是从零开始的,因此十二月是11),那么它将成为下一年的一月。如果月的第几天设置为0,则它将成为上个月的最后一天。这也适用于使用日期时间字符串格式.

日期时间字符串格式

有很多方法可以将日期格式化为字符串。JavaScript规范只指定了一种普遍支持的格式:日期时间字符串格式是ISO 8601日历日期扩展格式的简化。格式如下:

YYYY-MM-DDTH:MM:ss.sssZ年/月/日
  • YYYY年是年份,有四位数(00009999),或作为扩展年属于+-后跟六位数字。扩展年份需要该标志。-000000被明确禁止作为有效年份。
  • MM(毫米)是月份,有两位数(0112). 默认为01.
  • 尽职调查是月份的第几天,有两位数(0131). 默认为01.
  • 是一个文字字符,指示时间字符串的一部分指定时间部分时是必需的。
  • HH(小时)是小时,有两位数(0023). 作为特殊情况,24:00:00是允许的,并被解释为第二天开始时的午夜。默认为00.
  • 毫米是分钟,有两位数(0059). 默认为00.
  • 不锈钢是第二个,有两个数字(0059). 默认为00.
  • 不锈钢是毫秒,有三位数字(000999). 默认为000.
  • Z是时区偏移量,可以是文本字符Z(表示UTC),或+-然后HH:mm,与UTC的偏移量(以小时和分钟为单位)。

可以省略各种组件,因此以下内容都有效:

  • 日期格式:YYYY年,年月日,年-月-日
  • 日期时间格式:上述日期格式之一,后跟,后面是HH:mm,高:毫米:秒,或HH:mm:ss.ss(高高:毫米:秒)。每个组合后面都可以跟一个时区偏移量。

例如,"2011-10-10"(仅限日期形式),“2011-10-10T14:48:00”(日期-时间形式),或“2011-10-10T14:48:00.000+09:00”(日期-时间带有毫秒和时区的表单)都是有效的日期时间字符串。

当不存在时区偏移时,只有日期的表单被解释为UTC时间,而日期时间的表单则被解释为本地时间。这是由于与ISO 8601不一致的历史规范错误,但由于web兼容性无法更改。请参见破解的解析器——一个网络现实问题.

日期.parse()日期()构造函数都接受日期时间字符串格式的字符串作为输入。此外,当输入与此格式不匹配时,允许实现支持其他日期格式。

这个到ISOString()方法以日期时间字符串格式返回日期的字符串表示形式,时区偏移量始终设置为Z(UTC)。

注:我们鼓励您确保输入符合上述日期时间字符串格式,以实现最大兼容性,因为不保证支持其他格式。然而,在所有主要实现中都支持一些格式,比如副本请求2822格式-在这种情况下,它们的使用是可以接受的。始终进行跨浏览器测试以确保代码在所有目标浏览器中都能正常工作。如果要容纳许多不同的格式,库可以提供帮助。

非标准字符串可以根据实现的需要以任何方式进行解析,包括时区——大多数实现默认使用本地时区。实现不需要为边界外日期组件返回无效的日期,尽管它们通常会这样做。字符串可能具有边界内日期组件(具有上面定义的边界),但并不表示实际的日期(例如,“2月30日”)。在这种情况下,实现的行为不一致。这个日期.parse()第页提供了有关这些非标准案例的更多示例。

设置日期格式的其他方法

请参阅的格式toString(字符串)方法返回值部分中的示例。

施工单位

日期()

当作为构造函数调用时,返回一个新的日期对象。当作为函数调用时,返回当前日期和时间的字符串表示形式。

静态方法

日期.now()

返回与当前时间(自1970年1月1日00:00:00 UTC以来的毫秒数)相对应的数值,忽略闰秒。

日期.parse()

分析日期的字符串表示形式,并返回自1970年1月1日00:00:00 UTC以来的毫秒数,忽略闰秒。

日期。UTC()

接受与构造函数最长形式相同的参数(即2到7),并返回自1970年1月1日00:00:00 UTC以来的毫秒数,忽略闰秒。

实例属性

这些属性定义于日期.原型并由所有人共享日期实例。

日期.原型.结构

创建实例对象的构造函数。对于日期实例,初始值为日期构造函数。

实例方法

Date.prototype.getDate()

返回月份的第几天(131)根据当地时间指定日期。

日期.原型.获取日期()

返回星期几(06)根据当地时间指定日期。

日期.prototype.getFullYear()

根据当地时间返回指定日期的年份(4位数表示4位数年份)。

Date.prototype.getHours()

返回小时(023)根据当地时间在指定日期内。

日期.prototype.getMilliseconds()

返回毫秒(0999)根据当地时间在指定日期内。

Date.prototype.getMinutes()

返回分钟数(059)根据当地时间在指定日期。

Date.prototype.getMonth()

返回月份(011)根据当地时间在指定日期内。

Date.prototype.getSeconds()

返回秒数(059)根据当地时间在指定日期内。

Date.prototype.getTime()

返回指定日期的数值,即自1970年1月1日00:00:00 UTC以来的毫秒数。(以前的时间返回负值。)

Date.prototype.getTimezoneOffset()

返回当前区域设置的时区偏移量(以分钟为单位)。

日期.prototype.getUTCDate()

返回月份的日期(131)按照国际时间在指定日期内。

日期.prototype.getUTCDay()

返回星期几(06)按照国际时间在指定日期内。

日期.原型.getUTCFullYear()

根据通用时间返回指定日期中的年份(4位数表示4位数年份)。

Date.prototype.getUTCHours()

返回小时数(023)根据国际时间在指定日期内。

日期.prototype.getUTCMilliseconds()

返回毫秒(0999)按照世界时间在指定的日期。

日期.prototype.getUTCMinutes()

返回分钟数(059)按照国际时间在指定日期内。

日期.原型.getUTCMonth()

返回月份(011)按照国际时间在指定日期内。

日期.prototype.getUTCSeconds()

返回秒数(059)按照国际时间在指定日期内。

Date.prototype.getYear() 已弃用

根据当地时间返回指定日期中的年份(通常为2–3位数字)。使用获取完整年()而不是。

Date.prototype.setDate()

根据当地时间设置指定日期的月份日期。

日期.prototype.setFullYear()

根据当地时间设置指定日期的完整年份(例如,4位数年份为4位数)。

日期.prototype.setHours()

根据本地时间设置指定日期的小时数。

日期.prototype.setMilliseconds()

根据本地时间设置指定日期的毫秒数。

日期.prototype.setMinutes()

根据本地时间设置指定日期的分钟数。

Date.prototype.setMonth()

根据本地时间设置指定日期的月份。

日期.prototype.setSeconds()

根据本地时间设置指定日期的秒数。

日期.prototype.setTime()

设置日期对象设置为自1970年1月1日00:00:00 UTC以来的毫秒数。之前的时间使用负数。

日期.原型.设置UTCDate()

根据通用时间设置指定日期的月份日期。

日期.原型.setUTCFullYear()

根据国际时间设置指定日期的完整年份(例如,4位数年份为4位数)。

日期.prototype.setUTCHours()

根据通用时间设置指定日期的小时。

日期.prototype.setUTCMilliseconds()

根据通用时间设置指定日期的毫秒数。

日期.prototype.setUTCMinutes()

根据世界时间设置指定日期的分钟数。

日期.原型.setUTCMonth()

根据通用时间设置指定日期的月份。

日期.prototype.setUTCSeconds()

根据世界时间设置指定日期的秒数。

日期.prototype.setYear() 已弃用

根据当地时间设置指定日期的年份(通常为2–3位数字)。使用setFullYear()而不是。

Date.prototype.toDateString()

返回日期作为一个人类可读的字符串,如‘2018年4月12日星期四’.

Date.prototype.toISOString()

将日期转换为遵循ISO 8601扩展格式的字符串。

日期.prototype.toJSON()

返回表示日期使用到ISOString().拟由使用JSON.stringify().

Date.prototype.toLocaleDateString()

根据系统设置返回一个字符串,其中包含此日期的日期部分的区域敏感表示形式。

日期.原型.toLocaleString()

返回具有此日期的位置敏感表示形式的字符串。覆盖Object.prototype.toLocaleString()方法。

Date.prototype.toLocaleTimeString()

根据系统设置返回一个字符串,其中包含此日期时间部分的位置敏感表示形式。

Date.prototype.toString()

返回表示指定日期对象。覆盖Object.prototype.toString()方法。

Date.prototype.toTimeString()

返回日期作为人类可读的字符串。

日期.原型.toUTCString()

使用UTC时区将日期转换为字符串。

日期.原型.valueOf()

返回日期对象。覆盖Object.prototype.valueOf()方法。

日期原型[Symbol.toPrimitive]()

转换此日期对象设置为原语值。

示例

创建Date对象的几种方法

以下示例显示了创建JavaScript日期的几种方法:

注:从字符串创建日期有很多行为不一致。请参见日期时间字符串格式有关使用不同格式的警告。

js公司
const today=new Date();const生日=新日期(“1995年12月17日03:24:00”);//DISCOURAGED:可能无法在所有运行时工作const birthday2=新日期(“1995-12-17T03:24:00”);//这是标准化的,工作可靠const birthday3=新日期(1995年11月17日);//月份为0索引const birthday4=新日期(1995,11,17,3,24,0);const birthday5=新日期(628021800000);//传递epoch时间戳

toString方法返回值的格式

js公司
const date=new date(“2020-05-12T23:50:21.817Z”);date.toString();//2020年5月12日星期二18:50:21 GMT-0500(中部夏时制)date.toDateString();//2020年5月12日星期二date.toTimeString();//18:50:21 GMT-0500(中部夏时制)日期[Symbol.toPrimitive](“字符串”);//2020年5月12日星期二18:50:21 GMT-0500(中部夏时制)date.toISOString();//2020-05-12T23:50:21.817Zdate.toJSON();//2020-05-12T23:50:21.817Z日期.toUTCString();//2020年5月12日星期二23:50:21 GMTdate.toLocaleString();//2020年5月12日下午6:50:21date.toLocaleDateString();//5/12/2020date.toLocaleTimeString();//下午6:50:21

获取日期、月份和年份或时间

js公司
const date=新日期(“2000-01-17T16:45:30”);常量[month,day,year]=[date.getMonth(),date.getDate(),date.getFullYear(),];//[0,17,2000]作为月份的0索引const[小时,分钟,秒]=[date.getHours(),date.getMinutes(),date.getSeconds(),];// [16, 45, 30]

两位数年份的解释

新日期()表现出具有两位数年份值的遗留不良、不一致行为;具体来说,当新日期()call被赋予一个两位数的年份值,该年份值不会被视为文字年份,并被用作-is,而是被解释为相对偏移量,在某些情况下是与年份的偏移量1900,但在其他情况下,作为当年的抵消2000.

js公司
let date=新日期(98,1);//1998年2月1日星期日00:00:00 GMT+0000(GMT)date=新日期(22,1);//1922年2月1日星期三00:00:00 GMT+0000(GMT)date=新日期(“2/1/22”);//2022年2月1日星期二00:00:00 GMT+0000(GMT)//遗留方法;总是将两位数的年份值解释为相对于1900date.setYear(98);date.toString();//1998年2月1日星期日00:00:00 GMT+0000(GMT)date.setYear(22);date.toString();//1922年2月1日星期三00:00:00 GMT+0000(GMT)

因此,要创建和获取年份之间的日期099,而使用首选setFullYear()获取完整年()方法:。

js公司
//首选方法;从不将任何值解释为相对偏移,//而是使用年份值as-isdate.setFullYear(98);date.getFullYear();//98(非1998)date.setFullYear(22);date.getFullYear();//22(不是1922年,不是2022年)

计算运行时间

以下示例显示了如何确定两个JavaScript日期之间的运行时间(以毫秒为单位)。

由于天数(由于夏令时转换)、月份和年份的长度不同,用大于小时、分钟和秒的单位表示所用时间需要解决许多问题,在尝试之前应进行彻底研究。

js公司
//使用Date对象const start=日期.now();//时间事件如下:为长时间()做某事;const end=日期.now();const消逝=结束-开始;//已用时间(毫秒)
js公司
//使用内置方法const start=new Date();//时间事件如下:为长时间()做某事;const end=新日期();const passed=end.getTime()-start.getTime();//已用时间(毫秒)
js公司
//测试函数并返回其返回值函数printElapsedTime(testFn){const startTime=日期.now();常量结果=testFn();const endTime=日期.now();console.log(`Elapsed time:${String(endTime-startTime)}毫秒`);返回结果;}const yourFunctionReturn=打印已用时间(yourFuction);

注:在支持性能API的高分辨率时间功能,性能.now()可以提供比日期.now().

获取自ECMAScript纪元以来的秒数

js公司
const seconds=数学地板(Date.now()/1000);

在这种情况下,只返回整数很重要,所以简单的除法是不行的。只返回实际经过的秒数也很重要。(这就是为什么此代码使用数学地板()、和 数学round().)

规格

规范
ECMAScript语言规范
#秒日期对象

浏览器兼容性

BCD表仅在浏览器中加载

另请参见