【问题标题】:JavaScript Time ParsingJavaScript 时间解析
【发布时间】:2021-01-30 14:30:18
【问题描述】:

我想将字符串转换为日期对象。时间可能采用不同的格式,例如 2020-01-01 或 2020/01/01,也可能精确到分钟。

JavaScript 中的时间解析有时会产生奇怪的结果。

new Date("2021-01-01") // Fri Jan 01 2021 09:00:00 GMT+0900
new Date("2021-01-01 00:00") // Wed Jan 01 2020 00:00:00 GMT+0900

我输入的第一个日期被认为是 UTC,第二个被认为是本地日期。

有什么方法可以正确解析它们吗?

【问题讨论】:

  • 考虑使用momentjs 来轻松管理随时间推移的功能。
  • 第二个不是符合标准的字符串 - JavaScript 规范说在日期和时间之间需要T,空格将导致特定于实现的解析。即使是这样,规范也很明确 - date 字符串被解析为 UTC,date-time 字符串被解析为本地时间。
  • 我的要求是字符串到时间的转换。 new Date() 方法似乎在不同的情况下返回不同的时间,例如“2020-01-01”和“2020-01-01 00:00”,这两个看似相同的时间以不同的方式解析。也许我应该使用 moment.js
  • 正如我所说,根据规范,date 字符串和 date-time 字符串的处理方式确实不同。您需要使用相同的格式来获得可重复的结果。见Converting a string to a date in JavaScriptI have a UTC string and I want to convert it to UTC Date Object in JavaScript
  • @VLAZ 你是对的,但我认为结果有点令人困惑。在 moment.js 或人眼中,“2020-01-01”和“2020-01-01 00:00”是相同的时间。

标签: javascript time


【解决方案1】:

您可以使用new Date.getString() 以人类可读格式获取您所在时区的时间。如果你想要 UTC 日期,你可以使用new Date.getUTCString()
如果您想了解更多信息,可以查看 this MDN page 了解 Date 方法的说明。
这是一个工作演示:

var localDate = new Date("2021-01-01 00:00").toString()
var UTCDate = new Date("2021-01-01 00:00").toUTCString()
console.log(`Local Date: ${localDate}`)
console.log(`UTC Date: ${UTCDate}`)

【讨论】:

    【解决方案2】:

    最后,虽然这会带来额外的复杂性,但我还是使用了 Moment.js。

    const a = moment("2020-01-01 00:00").toDate();
    const b = moment("2020-01-01").toDate();
    console.log(a.getTime() == b.getTime());
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

    【讨论】:

      【解决方案3】:

      是的,您可以像这样将方法应用于Date 对象:

      const d = new Date()
      
      d.getTime();
      d.getDay()
      d.getFullYear()
      

      等等。 Here is more info

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多