从Moment JS获取JavaScript本地日期

时间:2019-11-25 18:30:20

标签: javascript node.js date heroku momentjs

考虑代码:

 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”

如何获取本地时间的JavaScript日期(不是字符串!)对象,表示2019-11-25T20:23:50

2 个答案:

答案 0 :(得分: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对象。时刻对象的“模式”不再相关,因为Date对象除了时间戳之外不跟踪任何其他内容。因此,Moment对象中的时间戳成为生成的Date对象的时间戳。由于您是从当前时间派生Moment对象,因此结果与您刚开始调用new Date()相同。

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

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

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

答案 1 :(得分:0)

我会尝试

Statement

但是,如果您打算将日期保存到数据库中,则最好以UTC格式保存时间,以便更轻松地进行全局转换。

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

Connection

希望这会有所帮助:)