Momentjs比较完整ISO格式时间字符串结果异常如何解决?
问题原因
你使用的ISO时间字符串不符合格式规范:标准ISO 8601时间的时分秒结构为HH:mm:ss,秒为2位数值,若需要携带毫秒则需补充小数点后缀,格式为HH:mm:ss.SSS。
你给出的时间字符串中秒部分写为3位(例如19:22:000),导致Momentjs解析所有时间均得到无效日期(Invalid Date),任意无效日期参与isAfter这类比较运算时,都会固定返回false。
你可以执行以下代码验证解析结果:
moment("2021-08-11T19:22:000+08:00").isValid() // 输出为false
修复方案
方案1:修正时间字符串格式(推荐)
将时间字符串中3位的秒调整为2位,需要保留毫秒精度的话补充小数点即可,示例调整后格式为2021-08-11T19:22:00.000+08:00,不需要毫秒的话可直接写为2021-08-11T19:22:00+08:00。
调整后的测试代码运行结果符合预期:
moment("2021-08-11T19:22:00.000+08:00").isAfter("2021-08-11T17:22:00.000+08:00", "minute") // true moment("2021-08-11T15:22:00.000+08:00").isAfter("2021-08-11T17:22:00.000+08:00", "minute") // false moment("2021-08-11T15:20:00.000+08:00").isAfter("2021-08-11T17:50:00.000+08:00", "minute") // false moment("2021-08-11T19:22:00.000+08:00").isAfter("2021-08-11T17:16:00.000+08:00", "minute") // true
方案2:显式指定解析格式
如果无法修改源时间字符串的生成规则,可以给Moment显式传入时间格式参数,强制按照你实际使用的结构解析:
// 第二个参数指定解析格式,第三个参数指定比较粒度 moment("2021-08-11T19:22:000+08:00", "YYYY-MM-DDTHH:mm:ssZ").isAfter("2021-08-11T17:22:000+08:00", "YYYY-MM-DDTHH:mm:ssZ", "minute") // true
内容的提问来源于stack exchange,提问作者elliotching
相关产品推荐
相关产品推荐

