当前位置: 首页 > 知识库问答 >
问题:

在JavaScript中什么是有效的日期时间字符串?

司马钱明
2023-03-14

在JavaScript中使用new datedate.parse时,我不能只传递任意的日期格式。根据格式的不同,我会得到一个与我想要的不同的日期,甚至invalid date而不是一个date对象。某些日期格式在一种浏览器中工作,而在其他浏览器中则不行。那么我应该使用哪种日期时间格式呢?

>

  • 所有浏览器都支持相同的格式吗?Mozilla Firefox、Google Chrome、Microsoft Internet Explorer、Microsoft Edge和Apple Safari如何处理日期时间字符串?那Node.js呢?

    它是否考虑到本地日期格式?例如。如果我住在瑞士,日期格式为30.07.2018,我是否可以使用新日期('30.07.2018')

    它考虑到当地时区了吗?

    如果您没有注意到,我回答了自己的问题(为什么?)。

  • 共有1个答案

    东门宜
    2023-03-14

    JavaScript正式支持ISO 8601扩展格式的简化。格式如下:yyyy-mm-ddthh:mm:ss.sssz。字母T是日期/时间分隔符,Z是指定为Z(对于UTC)或+-的时区偏移量,后跟时间表达式HH:MM。该格式的某些部分(例如时间)可以省略。

    注意,年必须至少有四位数字,月/天/小时/分钟/秒必须正好有两位数字,毫秒必须正好有三位数字。例如,99-1-1不是有效的日期字符串。

    以下是有效日期(时间)字符串的一些示例:

    • 2018-12-30
    • 2018-12-30T20:59
    • 2018-12-30T20:59:00
    • 2018-12-30T20:59:00.000Z
    • 2018-12-30T20:59:00.000+01:00
    • 2018-12-30T20:59:00.000-01:00

    当您省略时区偏移量时,date-times将解释为用户本地时间。当您完全省略时间时,日期将被解释为UTC。

    重要:所有现代的和相当旧的浏览器和实现都支持按照规范的完整长度的日期时间格式。但是,在没有时区的日期(时间)字符串的处理上存在差异(详见下面的“缺少时区偏移量”)。不应使用没有时区的日期时间字符串(状态为2018)。相反,向date构造函数传递以毫秒为单位的unix时间戳或日期不同部分的单独参数。

    ECMAScript(JavaScript语言实现的规范)从一开始就支持new date(规范)和date.parse(规范)中的日期字符串。然而,最初的版本实际上并没有指定日期时间格式。这种情况在2009年发生了变化,当时ES5引入了日期时间格式的规范。

    ECMAScript将日期时间字符串格式指定为ISO 8601扩展格式的简化。格式如下:yyyy-mm-ddthh:mm:ss.sssz

    • YYYY是公历中0000到9999年的十进制数字。
    • -(连字符)在字符串中出现两次。
    • mm是一年中从01(1月)到12(12月)的月份。
    • DD是一个月中从01到31的某一天。
    • T字面显示在字符串中,表示时间元素的开始。
    • hh是自午夜起已过的完整小时数,以00到24的两位小数位数表示。
    • :(冒号)在字符串中出现两次。
    • mm是自一小时开始以来的完整分钟数,以00到59之间的两位小数表示。
    • ss是从一分钟开始以00到59的两位十进制数字表示的完整秒数。
    • (点)在字符串中显示。
    • sss是从第二个十进制数字开始后的完整毫秒数。
    • Z是指定为“Z”(表示UTC)或“+”或“-”的时区偏移量,后跟时间表达式hh:mm

    该规范还提到,如果“字符串不符合[指定的]格式,则函数可能返回到任何特定于实现的启发式或特定于实现的日期格式”,这可能导致在不同浏览器中出现不同的日期。

    ECMAScript不考虑任何用户本地日期时间格式,这意味着您不能使用特定于国家或地区的日期时间格式。

    该规范还包括以下较短格式。

      null
    • thh:mm
    • THH:MM:SS
    • thh:mm:ss.sss

    [...]如果MMDD字段不存在,则使用“01”作为值。如果hhmmss字段不存在,则“00”用作值,而不存在的sss字段的值为“000”。当不存在时区偏移量时,仅日期表单将解释为UTC时间,而日期-时间表单将解释为本地时间。

    有关缺少浏览器支持的更多信息,请参阅下面的“缺少时区偏移量”。

    ECMAScript的date time格式还指定了扩展年份,它是六位数的年份值。这种扩展年份字符串格式的示例类似于+287396-10-12T08:59:00.992Z,它表示公元287396年中的一个日期。扩展年份可以是正的,也可以是负的。

    ECMAScript指定了广泛的日期对象属性。给定有效的日期对象,可以使用date.prototype.ToIsoString()获取有效的日期时间字符串。请注意,时区始终为UTC。

    new Date().toISOString() // "2018-08-05T20:19:50.905Z"
    

    还可以使用以下函数检测date对象是有效的还是无效的date

    function isValidDate(d) {
      return d instanceof Date && !isNaN(d);
    }
    

    以下日期时间格式根据规范都是有效的,应该在每个支持ES2016或更高版本的浏览器、Node.js或其他实现中工作。

    2018
    2018-01
    2018-01-01
    2018-01-01T00:00
    2018-01-01T00:00:00
    2018-01-01T00:00:00.000
    2018-01-01T00:00:00.000Z
    2018-01-01T00:00:00.000+01:00
    2018-01-01T00:00:00.000-01:00
    +002018-01-01T00:00:00.000+01:00
    

    请注意,根据规范,以下示例是无效的。但是,这并不意味着没有浏览器或其他实现将它们解释到某个日期。请不要使用下面的任何日期时间格式,因为它们是非标准的,并且在某些浏览器或浏览器版本中可能会失败。

    2018-1-1 // month and date must be two digits
    2018-01-01T0:0:0.0 // hour/minute/second must be two digits, millisecond must be three digits
    2018-01-01 00:00 // whitespace must be "T" instead
    2018-01-01T00 // shortest time part must have format HH:mm
    2018-01-01T00:00:00.000+01 // time zone must have format HH:mm
    

    今天,每一个现代的和相当旧的浏览器都支持2009年ES5规范中引入的日期时间格式。然而,即使在今天(状态2018),对于没有时区的日期时间字符串也有不同的实现(参见下面的“缺少时区偏移量”)。如果需要支持较旧的浏览器或使用没有时区的字符串,则不应使用日期时间字符串。相反,向date构造函数传递1970年1月1日00:00:00 UTC以来的毫秒数或表示不同日期部分的两个或多个参数。

    ES5在2009年引入了日期时间字符串的规范。在此之前,没有所有浏览器都支持的指定格式。因此,每个浏览器供应商都增加了对不同格式的支持,而这些格式在不同的浏览器(和版本)中通常不起作用。有关古代历史的一个小例子,请参见日期格式。

    大多数浏览器仍然支持那些遗留格式,以便不破坏旧网站的向后兼容性。但是依赖这些非标准格式是不安全的,因为它们可能不一致或随时被删除。

    ES2018首次指定了date.prototype.ToString()date.prototype.ToutcString()返回的日期格式。早在此之前,ECMA规范就要求date构造函数和date.parse来正确解析这些方法返回的格式(即使它在2018年之前没有指定格式)。

    Sun Feb 03 2019 14:27:49 GMT+0100 (Central European Standard Time)
    

    date.prototype.ToutcString()返回一个日期,格式与date.prototype.ToString()相似,但时区偏移量为零。示例格式可能如下所示:

    Sun, 03 Feb 2019 13:27:49 GMT
    

    请注意,与date.prototype.ToutcString()相比,weekday和day month被颠倒后有一个逗号

    由于那些格式在2018年才被指定,所以您不应该依赖于它们在不同的实现(尤其是较旧的浏览器)中同等地工作。

    node.js运行在V8 JavaScript引擎上,该引擎也在Google Chrome中使用。因此关于日期时间字符串格式的相同规范也适用。但是,当代码在后端运行时,用户本地时间不会影响时区,而只有服务器上的设置才会影响时区。大多数承载Node.js应用程序的平台即服务(PaaS)提供者都使用UTC作为其默认时区。

    js是一个非常流行的库,可以帮助处理JavaScript中的日期,它还支持比ECMAScript指定的更多格式。此外,Moment.js还支持基于字符串和任意格式创建日期对象。

    Luxon支持ISO 8601、HTTP、RFC2822、SQL和任意格式的解析。但只能对不同的日期和时间格式使用不同的函数。

    ES2017的变化

    没有显著变化。

    ES2016的变化

    有关更改的详细信息,请参阅日期时间字符串格式:与ES5的默认时区差异不与Web兼容。

    ES5.1的更改

    如果MMDD字段不存在,则使用“01”作为值。如果hhmmss字段不存在,则“00”用作值,而不存在的sss字段的值为“000”。不存在时区偏移量的值为“z”

    ES5的变化

    ECMAScript规范首次引入日期时间字符串格式。

    ECMAScript根据ISO 8601扩展格式的简化定义了日期时间的字符串交换格式。格式如下:yyyy-mm-ddthh:mm:ss.sssz

    初始规格:ES1

    ES1引入了在new date(value)date.parse(value)中使用的日期时间字符串。但是,它没有规定实际的日期(时间)格式,它甚至指出

    [...]date.parse生成的值依赖于实现[...]

    • [...]
    • date.parse(x.toString())
    • date.parse(x.togmtString())

    但是,date.prototype.ToString()date.prototype.ToGMtString()的返回值都指定为“依赖于实现”。

     类似资料:
    • 问题内容: 使用或在JavaScript中使用时,我不能只传递任意日期格式。根据格式的不同,我得到的日期可能会不同,甚至会得到日期对象。某些日期格式只能在一种浏览器中使用,而不能在其他浏览器中使用。那么我应该使用哪种日期时间格式? 其他问题: 所有浏览器都支持相同格式吗?Mozilla Firefox,Google Chrome,Microsoft Internet Explorer,Micros

    • 我有一个java代码,以特定的格式输入日期。 现在我输入的是无效日期。但它返回的日期是2016年1月14日星期四18:31:30。为什么会这样?如何使其返回null作为日期?

    • 目前我正在尝试用下面的代码将当前日期修剪成日、月和年。 null 我在下面的技术中尝试了我的代码。设置:使用Python 3.5.2(x64)、Python 3.6.1(x64)的local machine和使用Python 3.6.1的Repl.it 联机试用代码,复制并粘贴行代码

    • 问题内容: 最近开始使用WEB UI。并遇到了日期字符串解析/验证的问题。我发现“ dd-mm-yyyy”的一些方法是: 匹配-验证不完整,不灵活。 有人在帖子中建议使用可能的日期字符串对Set进行预初始化-快速,有效,但也不灵活且占用内存 有没有更简单的方法,也许可以在公共库中使用? 请不要建议SimpleDateFormat :) *Java 8的 *更新 正确答案是http://coding

    • 我有一个本地日期时间的字符串表示和一个Java时区。 我正在尝试以 MM/dd/yyyy HH:mm:ssZ 格式获取输出,但我无法弄清楚如何使用正确的日期时间和时区创建日历或 JodaTime 对象。如何将时区转换为可以通过简单日期格式“Z”或“z”解析的值? 和 返回 这是 。 是创建日历或Joda日期时间并通过解析字符串“08/14/2014 15:00:00”来设置各个年/月/日/小时/分

    • 问题内容: 我正在尝试将来自HTML文本字段的值与整数进行比较。它按预期工作。条件是- 文本字段的值在哪里。只要值介于1-999(含)之间,条件就会返回,否则返回。问题是,来自文本字段的值是字符串类型,我正在将其与整数类型进行比较。可以进行这种比较,还是应该使用parseInt()转换为整数? 问题答案: 因为JavaScript 以允许它们将操作数强制转换为不同类型的方式定义和(以及其他几个运算