我对mongoDB和javascript如何处理日期/时间感到非常困惑。

我在指定的时区给出了许多日期。我需要将它们以ISO格式存储在mongoDB中。例如:

给出:"01.01.2013 15:00",这是在纽约市的当地时间。

由于我的计算机未设置为NYC的时区,因此我创建了一个Date对象,它的给定偏移量为-04:00,因为NYC比UTC落后4个小时。所以:

var date = new Date("01-01-2013T15:00-04:00")。如果我打开mongo-express查看它实际存储的内容,它将显示ISODate("2013-01-01T14:00:00.000Z")

然后使用moment.js在纽约时间获取它:

  var test = moment("2013-01-01T14:00:00.000Z");
  var out = test.tz('America/New_York').format('MMMM Do YYYY, h:mm:ss a');
  console.log(out); //January 1st 2013, 9:00:00 am


这显然显示了错误的时间,应该显示3:00:00 pm。我在这里做错了什么?对于从任何时区连接到我的应用程序的任何客户端,我都需要这些时间相同,不应将其转换。最佳做法是什么?

最佳答案

如果您知道"01.01.2013 15:00"处于"America/New_York"时区,则可以使用moment-timezone的moment.tz方法对其进行解析。

如时刻docs所述:


  默认情况下,moment解析并以本地时间显示。
  
  如果要解析或显示UTC时间,可以使用moment.utc()代替moment()


这是一个实时示例:



var m = moment.tz("01.01.2013 15:00", "DD.MM.YYYY HH:mm", "America/New_York");
console.log(m.format('MMMM Do YYYY, h:mm:ss a'));

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.13/moment-timezone-with-data-2012-2022.min.js"></script>

10-05 20:54
查看更多