片刻JS解析奇怪的行为

时间:2017-02-17 16:49:07

标签: javascript date parsing momentjs

我使用moment.parse字符串+格式方法

当我致电moment("=min(C2:C4)", 'DD/MM/YYYY')时,它会评估为有效日期

Sun Apr 02 2017 00:00:00 GMT + 0300(FLE白天时间)

我无法理解时刻如何将"=min(C2:C4)"解析为有效日期。只是想知道,有人可以解释。

1 个答案:

答案 0 :(得分:6)

来自Moment.js文档:

  

Moment的解析器非常宽容,这可能会导致意外/意外行为。

简短回答:由于您预期的松散格式,所以会在2作为日期解析,4作为月份。< / p>

答案很长:

如果在控制台中运行命令并查看结果,则可能更容易实现这一点。我建议先看看那里,我会解释下面的重要部分。

  1. 日期字符串与格式
  2. 您已将自己的字符串指定为"=min(C2:C4)",格式为DD/MM/YYYY,所以当时正在查找该常规格式的日期:一天后跟一个月后跟一年。

    1. moment._pf.unusedTokens[]
    2. 这是一个数组,有一个值'YYYY';解析器找不到一年,但确实找到了一天一个月......嗯。

      1. moment._pf.unusedInput[]
      2. 这告诉我们更多 - 一个包含三个值的数组:

        1. '=min(C'
        2. ':C'
        3. ')'
        

        看起来时刻发现24匹配日期和月份。您可以在moment._pf.parsedDateParts数组中找到这些值。

        所以,这应该解释为什么日期是April 2, 2017。 3个月(这是最终确定的月份,而不是解析的实际值。月份为零索引,因此它回到“4”)和2天。没有给出年份,所以时刻假定它是当前年份。没有给出时间,因此它假设了一天的开始。

        如果您不想要这种行为,则应将第3个/最后一个参数传递为true(严格匹配)。查看http://momentjs.com/docs/#/parsing/string-format/了解详情。