【问题标题】:Get JavaScript local date from Moment JS从 Moment JS 获取 JavaScript 本地日期
【发布时间】:2019-11-25 18:30:20
【问题描述】:

考虑代码:

 let now = moment();
 console.log(now.format());  // 2019-11-25T20:23:50+02:00
 console.log(now.toDate());  // 2019-11-25T18:23:50.916Z

这是我本地机器上的输出,当我在 Heroku 上检查应用程序时 它给出了相同的值,即使我像这样更改了 TZ:

heroku 配置:添加 TZ="Asia/Jerusalem"

如何获取我的 localtime 的 JavaScript Date (Not a String !) 对象,意思是 2019-11-25T20:23:50

【问题讨论】:

  • 日期对象没有时区,它们是 UTC。产生本地值的方法(toStringgetHoursgetMinutes 等)使用系统时区偏移和设置。
  • 第一个字符串是UTC+2,即当前的耶路撒冷偏移量。第二个字符串是 UTC+0(或纯 UTC)。它们都显示相同的瞬间,只是具有不同的偏移量,因为控制台对每个对象使用不同的 toString 方法。 2019-11-25T20:23:50 没有偏移量,因此它将被视为本地,并代表具有不同本地偏移量的每个地方的不同时刻。

标签: javascript node.js date heroku momentjs


【解决方案1】:

让我们看一下您的代码示例:

let now = moment();

您创建了一个Moment 对象。您不传递任何参数,因此它使用当前时间戳进行初始化(就像您调用了Date.now())并设置为“本地模式”。

console.log(now.format());  // 2019-11-25T20:23:50+02:00

通过调用format,您要求Moment 对象生成String。由于它处于本地模式,因此适用于本地时区的那个时刻的偏移量会在结果中发出,并且结果中显示的墙壁时间会针对该偏移量进行调整。在这种情况下,当地时间比 UTC 早两个小时。然后将该字符串传递给console.log,后者将其发送到控制台。

console.log(now.toDate());  // 2019-11-25T18:23:50.916Z

通过调用toDate,您要求Moment 对象创建一个Date 对象。 moment 对象的“模式”不再相关,因为 Date 对象不跟踪时间戳以外的任何内容。因此,Moment 对象中的时间戳成为生成的Date 对象的时间戳。由于您从当前时间派生了Moment 对象,因此结果与您刚刚调用new Date() 开始时的结果相同。

然后您将字符串传递给console.log - 除了不能只记录一个对象,因此它首先必须将其转换为 something 以便您可以看到它。这是有趣的部分:没有关于这种行为的规范。ECMAScript 的实现可以在这方面做任何他们喜欢的事情。某些实现,例如在您的示例中,将调用 .toISOString() 并记录结果。由于.toISOString() 以UTC 显示结果,因此记录Date 对象的结果也以UTC 显示。但其他实现将在Date 对象上调用.toString() 并记录它,结果是在本地 时间。完全有可能一些未来的实现可以在一些图形或交互式输出中显示结果。关键是,你不能依赖console.log(Date) 的行为来保持一致。

更改您的时区设置不会改变此结果。 Date 对象本质上是基于 UTC 的,您的输出也是基于 UTC 的,并且 UTC 在整个星球上都是相同的(根据设计)。

如果您希望时区反映在字符串输出中,您必须使用一个函数来生成与本地时间相关的字符串。正如您所展示的,您将在本地模式下通过Moment 对象上的.format() 获得它。您还可以通过在 Date 对象上调用 .toString() 来获得一个(但生成的字符串不是相同的 ISO 8601 格式)。

【讨论】:

    【解决方案2】:

    我会试试的,

    moment().local().toDate() 
    

    但如果您打算将日期保存到数据库中,最好以 UTC 格式保存时间以便于全局转换。

    如果您想使用时区,您可能还需要时刻时区包 - https://momentjs.com/timezone/docs/

    npm install moment-timezone
    

    希望这会有所帮助:)

    【讨论】:

    • 不确定moment().local().toDate() 产生的结果与new Date() 不同。
    • 我确实需要将日期和时间保存到数据库,这就是问题所在。我需要操作日期和时间,我们需要在本地时间下工作。你为什么认为节省时间更好在 UTC 下?
    猜你喜欢
    • 2018-02-10
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2018-04-24
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多