【问题标题】:How to validate a moment.js duration?如何验证 moment.js 持续时间?
【发布时间】:2016-08-01 07:16:21
【问题描述】:

似乎只有一个 moment() 对象有一个 isValid() 方法来检查所提供数据的有效性。 moment.duration() 对象是否有任何等价物?因为 isValid() 似乎不存在持续时间。

【问题讨论】:

  • 也许你可以使用moment.isDuration(obj);
  • 您认为有效的持续时间是多少?
  • moment.isDuration 仅检查 obj 是否为持续时间类型。它不检查它是否有效。
  • 嗯,但这正是我的观点,moment() 有一个 isValid 方法,如果提供无效的输入,那将是无效的。 duration 返回的持续时间为 0,既不一致也无帮助
  • moment.duration(5, 'mintes')moment.duration('foo') 是无效的示例。在这种情况下让它返回 0 意味着你有一个很难找到的错误。想出一些无效的输入并不是很困难,无论是一些不受支持的单位(不太可能)还是一个简单的错字。在我看来,如果您调用 isValid 方法,它已经走得太远了。到那时它应该已经抛出或返回 undefined。

标签: momentjs duration


【解决方案1】:

我同意这似乎是暂时的遗漏。由于我有需要,我想出了以下验证持续时间的解决方法。洞察力是无效的持续时间会导致持续时间恰好是“P0D”。只是在这里分享:

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

希望这会有所帮助!

【讨论】:

  • 如果您有意创建零长度持续时间,这将不起作用。当 moment 获得无效的持续时间单位时,它默认为零。所以在这种情况下,这会给你一个假阴性。 (在发表此评论时,当前的时刻版本是 2.20.1。希望在未来的版本中会有更好的持续时间验证)。相关验证在此模块中:github.com/moment/moment/blob/develop/src/lib/duration/…
【解决方案2】:

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

【讨论】:

  • 这不起作用 P2W3DT4H5M6S 是有效的,与吐出的 P17DT4H5M6S 相同。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    相关资源
    最近更新 更多