如何用UTC解析日期时间?

时间:2014-10-13 23:53:26

标签: momentjs

我有一个像"10/14/2014 5:30:00 AM"这样的字符串。我需要将其解析为UTC字符串。但是当我执行moment.utc("10/14/2014 5:30:00 AM").format()时,我得到"2014-10-13T22:30:00+00:00",而我期望获得"2014-10-14T12:30:00+00:00"

我如何让momentJS相信我的字符串是一个UTC字符串并解析它而不会根据当地时区(在我的情况下为+7)移动时间?

2 个答案:

答案 0 :(得分:5)

这确实是一个错误,I filed it here。只要您允许时间回退到浏览器的解析器,就会出现问题。如果您在运行此代码时在浏览器的调试控制台中观看,则会看到以下警告:

  

弃用警告:时刻构建回落到日期。这是不鼓励的,将在即将发布的主要版本中删除。有关详细信息,请参阅https://github.com/moment/moment/issues/1407

警告是正常的,告诉您不要以回退到JavaScript Date对象的解析器的方式使用时刻。您可以通过提供格式字符串来避免这种情况。

通常,在没有格式字符串的情况下传递m / d / y格式的值是个坏主意,因为并非所有用户都会在浏览器中设置该格式。像1/4/2014这样的值可以解释为1月4日或4月1日。

要明确告诉片刻以特定格式解析,pass the format string就像这样:

moment.utc("10/14/2014 5:30:00 AM", "M/D/YYYY h:mm:ss a")

答案 1 :(得分:4)

我发现完全相同的行为对我来说似乎是个错误,因为当一个不存在时,utc()不应该推断出时区。

解决方案是在调用utc()之前重新格式化您的日期。我发现数组语法和ISO 8601格式工作正常:

// Array format - Works
moment.utc([2014, 10, 14, 10, 05]).format()

// Nope
moment.utc("10/14/2014 5:30:00 AM").format();

// ISO 8601 - Works
moment.utc("2014-10-14 05:30:00").format();

JSFiddle:http://jsfiddle.net/0qw54nrb/