【问题标题】:Javascript Date in yyyy-mm-ddThh:mm:ss-offset not casting correctlyyyyy-mm-ddThh:mm:ss-offset 中的 Javascript 日期未正确转换
【发布时间】:2016-04-13 18:18:57
【问题描述】:

我的日期如下:

2016-04-13T09:57:21-04

我正在尝试将其转换为 javascript 日期:

event.timestamp = new Date(event.timestamp);

其中 event.timestamp 是日期的字符串表示形式。问题是这被设置为转换为未定义。我几乎可以肯定我的日期时间是有效的 ISO 格式。我在这里做错了什么?

编辑

有些人注意到日期时间无效,我同意 javascript 不这样认为,但我从 Scala API 调用生成日期时间

使用jodatime:

DateTime.now()

所以这将生成一个有效的日期时间(至少对于 scala)。 -04 是偏移量。我并不是在争论日期时间在 Javascript 中是否有效,因为这是显而易见的。 我很好奇是否有办法使它对 javascript 有效,因为 jodatime 日期库在 Java 和 Scala 中似乎很标准,我假设有一种方法可以使它与 JavaScript 一起使用。

编辑 2 Thriggle 的回答是正确的,但您也可以使用 Moment 以正确格式获取日期:

moment(event.timestamp, "YYYY-MM-DD HH:mm Z").toDate();

moment 可以按照我的格式读取日期时间 (2016-04-13T09:57:21-04)

【问题讨论】:

  • 日期无效。尝试新日期(“2016-04-13T09:57:21-04”);自己看看。问题是-04你要设置时区吗?
  • 日期结束时的“-04”是什么?请参阅此链接 - stackoverflow.com/questions/21826161/…
  • -04 是偏移量
  • 请注意,即使使用 moment.js,您仍然没有正确解析字符串,它被视为本地(也许您在时区 UTC-0400,所以不要注意到)。

标签: javascript date datetime


【解决方案1】:

日期时间字符串应该是 ISO 8601 扩展格式的简化:YYYY-MM-DDTHH:mm:ss.sssZ

来自the ECMAScript 2015 spec

Z 是指定为“Z”(对于 UTC)或“+”或“-”后跟时间表达式 HH:mm

的时区偏移量

因此,您的值应该是2016-04-13T09:57:21-04:00

编辑:正如 RobG 在 cmets 中敏锐地指出的那样,ECMAScript 2015 仅指定日期时间字符串遵循 ISO 8601 格式; IETF-compliant RFC 2822 timestamp 不是规范的一部分,尽管在本文发布时它已包含在 MDN documentation 中。

【讨论】:

  • 这不是 Scala 应用程序给我的。我是否需要将我在 Scala 中获得的每个日期时间转换为不同的字符串才能使用 javascript?
  • @PepperedLemons 除非有办法让 Scala 应用程序为您提供包含分钟的完整 ISO 日期字符串,否则您需要将字符串转换为有效值,然后再将其直接插入 JavaScript .
  • 很公平。我可以用 Moment 解决它。感谢您的帮助
  • @Thriggle Already asked and answered,关于在 Java 中将当前日期时间作为 ISO 8601 字符串获取。
  • @Thriggle 与几乎所有编程平台一样,JavaScript 中的日期时间处理非常有限且薄弱。 Java 中的 Joda-Time 库是第一次成功尝试以复杂的方式处理日期时间。后来作为 NodaTime 移植到 .Net。 Joda-Time 现在已被 Java 8 及更高版本中内置的 java.time 框架所取代,并向后移植到 Java 6 和 7 以及 Android。
【解决方案2】:

强烈建议您不要使用 Date 构造函数或 Date.parse 来解析字符串。该行为很大程度上取决于实现且不一致。您应该使用库中的解析器,或者如果您只支持一种或两种格式,请编写您自己的解析器(3 或 4 行带有验证的代码)。

在使用moment.js的情况下:

moment(event.timestamp, "YYYY-MM-DD HH:mm Z").toDate();

带有一串

"2016-04-13T09:57:21-04"

格式指定不正确(秒数丢失),因此未正确解析(秒数设置为零)。此外,时区指定为 GMT,但它不是,但由于格式中不包含偏移量,因此字符串被解析为本地。

因此,无论用户时区如何,所有用户都将看到完全相同的日期和时间,但它们的主机时区偏移量(因此每个不同偏移量的时间点不同)。

根据 moment.js 文档,它应该正确解析给定的字符串:

moment('2016-04-13T09:57:21-04', "YYYY-MM-DD HH:mm:ssZZ").toDate();

然而事实并非如此。让 moment.js 正确解析它的唯一方法是:

moment('2016-04-13T09:57:21-0400', "YYYY-MM-DD HH:mm:ssZZ").toDate());

moment('2016-04-13T09:57:21-0400').toDate());

即将“00”添加到时区偏移量。

首选传递格式的第一种方法,否则您将依赖 moment.js 尝试不同的格式,直到返回有效日期或将其提供给 Date.parse。 p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-01
    • 2019-12-24
    • 2017-10-30
    • 2013-11-20
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多