MomentJs输出toDate()的日期不正确

时间:2015-11-24 11:55:00

标签: javascript angularjs momentjs

我开始在Angular / Typescript项目中使用momentJs。 (包括它以任何方式相关,虽然我非常怀疑它)

在我的模块的run方法中,我调用

moment.locale(window.navigator.language);

在我的实例中正确地将语言环境设置为en-GB。我在下面用线来解析GB时间。

执行以下操作时:

var mom = moment("24/11/2015 00:00:00");
例如,

。这将使用全局设置的默认值填充新的时刻对象(如果我理解它应该如何正常工作)。妈妈约会时间为2016-12-11T00:00:00.000Z。这显然意味着它在en-US中解析了给定的字符串,而不是在此调用之前通过Locale在默认设置中设置的en-GB。有没有什么我错过配置/设置的时刻会使这不起作用? 我还检查了变量的_locale属性。 mom._locale设置为en-gb,我可以看到L,LL,LLL等格式都是en-GB格式的值(因为它们应该是)。

运行mom.toDate();毫无疑问地返回由时刻对象在内部存储的2016日期。

我忘了包含一些misc信息:

我正在使用NuGet的最新版本的momentjs(编写本文时的版本2.10.6),我在我的HTML中加入了与locales.js的时刻

3 个答案:

答案 0 :(得分:2)

使用任何最新版本的MomentJS,您应该在控制台中看到原因:

  

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

enter image description here

除非您指定格式字符串,否则MomentJS依赖于Date对象的解析,不幸的是,无论Date对象的区域设置如何,使用/的字符串都是如此,假设美国格式。使用Date的许多事情中的一个并不完全正确。

您需要使用格式字符串,或者以Date使用的简化ISO-8601格式提供字符串。来自Parse > String

  

从字符串创建片刻时,我们首先检查字符串是否与已知的ISO 8601格式匹配,如果找不到已知格式,则返回new Date(string)

var day = moment("1995-12-25");
     

警告:解析字符串的浏览器支持不一致。因为没有关于应该支持哪种格式的规范,所以在某些浏览器中有效的功能在其他浏览器中不起作用。

     

为了解析除ISO 8601字符串以外的任何其他内容的一致结果,您应该使用String + Format。

答案 1 :(得分:1)

所以我通过从瞬间获取语言环境数据并将其传递给format参数来解决这个问题。考虑" 24/11/2015 00:00:00"的示例输入我将按以下格式构建我的格式:

$checkbashisms test.sh
$

这将生成格式掩码" DD / MM / YYYY HH:mm:ss"。

您可以混合和匹配您想要的任何格式,这将是特定于您设置的任何时间的区域设置。(假设您已经设置了区域设置信息)< / p>

这是一个疯狂的解决方法,我很惊讶,在解析时,不会将区域设置信息假定为默认值。 TJCrowder已经在Github上提出了一个问题,我建议任何关心的人应该发表评论。 returns a boolean

答案 2 :(得分:0)

你可能最好直接将格式传递给片刻并事先验证字符串。这将最终减少您需要进行的调试,并让您立即开始运行。

var mom = moment("24/11/2015 00:00:00", "DD/MM/YYYY HH:mm:ss");

你可以尝试新的(ish)Intl API但是浏览器支持是有限的(IE11 +),所以我建议让用户在下拉列表中选择月份或强迫他们以某种方式输入。< / p>