【问题标题】:MomentJS getting JavaScript Date in UTCMomentJS 在 UTC 中获取 JavaScript 日期
【发布时间】:2015-01-08 11:48:48
【问题描述】:

我无法通过以下方式获取 MongoDB 记录的 JavaScript 日期字符串。它一直使用我的当地时间。

var utc = moment.utc().valueOf();
console.log(moment.utc(utc).toDate());

输出:

Tue Nov 11 2014 14:42:51 GMT-0500 (EST)

我需要它是 UTC,所以我可以在 Mongo 中粘贴这个时间戳,所以类型是 Date

我该怎么做?

【问题讨论】:

  • 按原样存储日期对象时会出现什么问题?
  • 它被存储为双精度对象,而不是日期类型对象。我需要它是UTC的toDate()。度过了一段可怕的时光。感谢您的帮助!
  • 我再问一次,当您按原样存储时会出现什么问题。它会加载不正确的日期吗?它会在不同的时区中断吗?
  • 为什么我不能这样做:var now = moment.utc().toDate(); 并存储它:(
  • 不确定as is是什么意思

标签: node.js momentjs


【解决方案1】:

时间戳是一个时间点。通常,这可以用 epoc 之后的毫秒数表示(1970 年 1 月 1 日 12AM UTC 的 Unix Epoc)。该时间点的格式取决于时区。虽然是同一时间点,但时区之间的“小时值”并不相同,必须考虑与UTC 的偏移量。

这里有一些代码来说明。 A point is time 以三种不同的方式捕获。

var moment = require( 'moment' );

var localDate = new Date();
var localMoment = moment();
var utcMoment = moment.utc();
var utcDate = new Date( utcMoment.format() );

//These are all the same
console.log( 'localData unix = ' + localDate.valueOf() );
console.log( 'localMoment unix = ' + localMoment.valueOf() );
console.log( 'utcMoment unix = ' + utcMoment.valueOf() );

//These formats are different
console.log( 'localDate = ' + localDate );
console.log( 'localMoment string = ' + localMoment.format() );
console.log( 'utcMoment string = ' + utcMoment.format() );
console.log( 'utcDate  = ' + utcDate );

//One to show conversion
console.log( 'localDate as UTC format = ' + moment.utc( localDate ).format() );
console.log( 'localDate as UTC unix = ' + moment.utc( localDate ).valueOf() );

哪个输出这个:

localData unix = 1415806206570
localMoment unix = 1415806206570
utcMoment unix = 1415806206570
localDate = Wed Nov 12 2014 10:30:06 GMT-0500 (EST)
localMoment string = 2014-11-12T10:30:06-05:00
utcMoment string = 2014-11-12T15:30:06+00:00
utcDate  = Wed Nov 12 2014 10:30:06 GMT-0500 (EST)
localDate as UTC format = 2014-11-12T15:30:06+00:00
localDate as UTC unix = 1415806206570

就毫秒而言,每个都是相同的。这是完全相同的时间点(尽管在某些运行中,后面的毫秒要高一毫秒)。

就格式而言,每个都可以在特定的时区中表示。并且该时区字符串的格式在完全相同的时间点看起来不同!

您要比较这些时间值吗?只需转换为毫秒。一个毫秒值始终小于、等于或大于另一个毫秒值。

您想比较特定的“小时”或“天”值并担心它们“来自”不同的时区吗?先用moment.utc( existingDate )转成UTC,再做运算。从 DB 出来时,这些转换的示例是示例中的最后一次 console.log 调用。

【讨论】:

  • 我认为你错过了问题的本质。
  • 我这样回答是因为他的问题显示了 MomentJS 的使用。这个想法是时间戳(数字)是实际值,而日期格式(单词)通常取决于当地时区。
  • new Date(moment.utc().format()) 不返回 UTC 日期。 "注意:重要的是要记住,虽然 Date 对象的核心时间值是 UTC,但获取日期和时间或其组件的基本方法都在本地(即主机系统)时区和偏移量中工作。”来自developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
【解决方案2】:

调用 toDate 将创建底层 JS Date 对象的 副本(文档完全错误地认为它不是副本)。 JS Date 对象存储在 UTC 中,并且总是打印到东部时间。无需了解 .utc() 是否修改了时刻包装的底层对象,请使用下面的代码。

你不需要时间。

new Date().getTime()

这是可行的,因为 JS Date 的核心是 Unix 时代的 UTC。这非常令人困惑,我认为界面中存在一个很大的缺陷,即像这样混合本地时间和 UTC 时间,而方法中没有任何描述。

【讨论】:

    【解决方案3】:

    或者简单地说:

    Date.now

    来自MDN documentation

    Date.now() 方法返回自 1970 年 1 月 1 日以来经过的毫秒数

    ECMAScript 5.1

    起可用

    和上面提到的一样(new Date().getTime()),但是更快捷的版本。

    【讨论】:

    • 这是 unix 时间,与 UTC 时间不太一样。
    • 这是错误的!仅当机器时区为 UTC 时才有效
    【解决方案4】:

    这将为您提供 UTC 时区 DateTime。

    var convertedUtcDateTime = moment.utc(dateTimeToBeConverted);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-08
      • 2020-01-03
      • 2015-01-08
      • 1970-01-01
      • 2019-11-01
      • 2015-01-08
      • 2019-03-05
      • 1970-01-01
      相关资源
      最近更新 更多