看起来只有moment()对象有isValid()方法来检查提供的数据是否有效。那么moment.duration()对象有没有等效的方法呢?因为持续时间似乎没有isValid()方法。
我同意这似乎是moment.js中的一个遗漏。因为我曾经有过这样的需求,所以我想出了以下验证持续时间的解决方法。关键在于,一个无效的持续时间会导致一个恰好为“P0D”的持续时间。在此分享:
durationIsValid(iso8601DurationString){
if(iso8601DurationString === 'P0D') return true;
return moment.duration(iso8601DurationString).toISOString() !== 'P0D';
}
moment.duration(myIso8601Duration)
进行解析,再次从中获取ISO8601字符串,使用toISOString
进行比较,然后将其与myIso8601Duration
进行比较。如果它们不同,则输入可能无效。我正在使用Moment 2.29。如果您的用例具有持续时间的最小有效长度,则很容易测试其有效性。例如,dur.isValid() && dur.as("minutes") >= 1
可以涵盖排版错误、使用NaN
作为数字输入、传递无效的ISO8601字符串等情况,因为所有这些情况都会导致零长度的持续时间。(如果对于您的用例实际上存在零长度的持续时间,请参考其他答案的指导...但它们可能不适用。)
moment.isDuration(obj);
。 - VincenzoCmoment.duration(5, 'mintes')
或moment.duration('foo')
。在这种情况下返回0意味着你有一个非常难以找到的错误。很容易想出一些无效的输入,无论是一些不支持的单位(不太可能)还是一个简单的拼写错误。在我看来,如果你正在调用isValid
方法,那么它已经走得太远了。此时它应该抛出异常或返回未定义。 - Paul Rooney