我对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>