如何验证moment.js的持续时间?

6

看起来只有moment()对象有isValid()方法来检查提供的数据是否有效。那么moment.duration()对象有没有等效的方法呢?因为持续时间似乎没有isValid()方法。


也许你可以使用 moment.isDuration(obj); - VincenzoC
你认为什么是有效的持续时间? - svarog
1
moment.isDuration仅检查obj是否为持续时间类型,而不检查其是否有效。 - schacki
2
嗯,但这正是我的观点,moment()有一个isValid方法,如果提供无效输入,则该方法将无效。duration返回0的持续时间,既不一致也不有用。 - schacki
1
一个无效的例子是 moment.duration(5, 'mintes')moment.duration('foo')。在这种情况下返回0意味着你有一个非常难以找到的错误。很容易想出一些无效的输入,无论是一些不支持的单位(不太可能)还是一个简单的拼写错误。在我看来,如果你正在调用 isValid 方法,那么它已经走得太远了。此时它应该抛出异常或返回未定义。 - Paul Rooney
显示剩余2条评论
3个回答

2

我同意这似乎是moment.js中的一个遗漏。因为我曾经有过这样的需求,所以我想出了以下验证持续时间的解决方法。关键在于,一个无效的持续时间会导致一个恰好为“P0D”的持续时间。在此分享:

durationIsValid(iso8601DurationString){
  if(iso8601DurationString === 'P0D') return true;
  return moment.duration(iso8601DurationString).toISOString() !== 'P0D';
}

希望这能有所帮助!

3
如果您有意创建零长度的时间段,那么这不起作用。当moment遇到无效的时间单位时,默认为零。因此,在这种情况下,这将给您一个错误的负面结果。(截至本评论时,当前的moment版本是2.20.1。希望在未来版本中会有更好的时间段验证)。相关的验证位于此模块中:https://github.com/moment/moment/blob/develop/src/lib/duration/constructor.js。 - RobotNerd

0
在进行ISO8601解析时,我建议尝试使用moment.duration(myIso8601Duration)进行解析,再次从中获取ISO8601字符串,使用toISOString进行比较,然后将其与myIso8601Duration进行比较。如果它们不同,则输入可能无效。

这个不起作用,P2W3DT4H5M6S是有效的,并且与P17DT4H5M6S相同,这就是输出的内容。 - Dan

0

我正在使用Moment 2.29。如果您的用例具有持续时间的最小有效长度,则很容易测试其有效性。例如,dur.isValid() && dur.as("minutes") >= 1可以涵盖排版错误、使用NaN作为数字输入、传递无效的ISO8601字符串等情况,因为所有这些情况都会导致零长度的持续时间。(如果对于您的用例实际上存在零长度的持续时间,请参考其他答案的指导...但它们可能不适用。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接