【问题标题】:Compare Dates from Rails to JavaScript比较 Rails 和 JavaScript 的日期
【发布时间】:2020-08-04 07:49:09
【问题描述】:

我正在开发一个项目的功能,该功能可以根据创建记录的日期更改元素的颜色。我正在使用 Rails 后端和 React 前端。 我正在努力确保颜色与适当的日期一致,而不是前一天或后一天。

在 Rails 中,我有一条记录,其中 created_at 属性为 "2020-07-29 17:38:00.437423" (PST)

在 React 中,同一条记录将其 created_at 属性显示为 "2020-07-29T17:38:00.437Z"

1.

new Date("2020-07-29 17:38:00.437423")
//=> Wed Jul 29 2020 17:38:00 GMT-0700 (Pacific Daylight Time)
new Date("2020-07-29T17:38:00.437Z")
//=> Wed Jul 29 2020 10:38:00 GMT-0700 (Pacific Daylight Time)

我注意到,当我在第二个版本中删除“Z”时,时间与我预期的一致,但为什么这些字符串返回显示 7 小时差异的日期对象?

【问题讨论】:

    标签: javascript ruby-on-rails reactjs date


    【解决方案1】:

    当您在浏览器中创建没有任何时区信息的日期时,它实际上会假定它在系统时区中:

    new Date("2020-07-29 17:38:00.437423")
    > Date Wed Jul 29 2020 17:38:00 GMT+0200 (Central European Summer Time)
    

    就我而言,它是GMT+0200,因为我在丹麦。哎呀。

    2020-07-29T17:38:00.437Z 实际上是一个 ISO8601 时间戳,其时区名称不那么模棱两可。

    如果时间为 UTC,则在时间后直接添加 Z,不带 空间。 Z 是零 UTC 偏移的区域指示符。 “世界标准时间 09:30” 因此表示为“09:30Z”或“0930Z”。 “14:45:15 UTC”将 为“14:45:15Z”或“144515Z”。
    ISO8601 - Wikipedia

    JavaScript 对日期和时间的处理是出了名的糟糕。在浏览器大战期间,当 Brendan Eich 在 10 天之内急于创建该语言时,他直接从 java 中彻底撕掉了日期/时间对象,并且浏览器供应商创建了不同的(糟糕的)实现。结果是 25 年后仍然困扰着我们的一团糟。

    有多个库,例如 moment.js,它们修复了语言的问题和不一致以及缺乏从一个 TZ 转换到另一个 TZ 或操纵日期的方法。

    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/moment.min.js"></script>
    

    我真的会推荐 Thoughtbot 的优秀文章 It's About Time (Zones) 用于后端。

    【讨论】:

    • 我仍然很困惑:在 Rails 中,我的日期已经是 UTC,所以当我使用任一字符串创建 Date 对象时,我希望它会返回相同的日期和时间。跨度>
    • 正如这里所解释的,期望是完全错误的。当客户端解析没有 TZ 的日期时,它将假定它在用户计算机的 TZ 中。
    • 哦,顺便说一句,我之前是想说谢谢你的回答。我忙于解决并忘记了。所以我现在正在做的是:d1 = new Date("2020-07-29T17:38:00.437Z") //=&gt; Wed Jul 29 2020 17:38:00 GMT-0700 (Pacific Daylight Time)d1.getUTCHours() //=&gt; 17 这是一个合适的解决方法吗?我主要是想推迟使用 moment,js 直到我理解它。
    【解决方案2】:

    max 的回答是正确的。我只是想澄清一下 Javascript 可以解析带有 UTC 偏移量的 ISO8601 时间戳,他只是忘记了一个“0”。

    new Date("2020-07-29T17:38:00.437-07:00")
    2020-07-30T00:38:00.437Z
    

    以下是规格供参考:https://tc39.es/ecma262/#sec-date-time-string-format

    我本来只想评论他的回答,但我没有名气。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      相关资源
      最近更新 更多