考虑代码:
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
?
答案 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
希望这会有所帮助:)