moment.js isBetween()意外返回false,日期定义疑存问题求解答
问题根源:日期格式不匹配导致解析失败
嘿,这个问题的核心很明确——你在使用moment.js解析日期时,指定的格式字符串和实际传入的日期字符串格式完全不匹配,导致moment无法正确解析这三个日期,最终生成的都是无效的moment实例,所以isBetween()(包括isBefore()/isAfter())才会返回不符合预期的结果。
具体分析你的代码:
你定义的格式是:
var format = 'YYYY-MM-DDTHH:mm:ss.SSSSZ';
这是ISO 8601标准的日期格式(类似2019-06-27T05:33:19.000+0000这种样式),但你传入的日期字符串却是:
'Thu Jun 27 2019 05:33:19 GMT+0000'
这是浏览器默认的Date.toString()输出格式,和你指定的格式完全不对应。当moment无法按照给定格式解析日期时,会返回一个无效的moment对象——你可以自己加一行console.log(testTime.isValid())验证,会输出false,这类无效实例在日期比较方法里自然会表现出异常行为。
两种修正方案:
方案一:使用匹配的格式字符串
对应'Thu Jun 27 2019 05:33:19 GMT+0000'的moment格式应该是'ddd MMM DD YYYY HH:mm:ss [GMT]Z',修改后代码如下:
var format = 'ddd MMM DD YYYY HH:mm:ss [GMT]Z'; var testTime = moment('Thu Jun 27 2019 05:33:19 GMT+0000', format); var startPeriod = moment('Thu Jun 27 2019 04:00:19 GMT+0000', format); var endPeriod = moment('Thu Jun 27 2019 10:00:19 GMT+0000', format); console.log(testTime.isValid()); // 现在会输出true console.log(testTime.isBetween(startPeriod, endPeriod)); // 输出预期的true
方案二:省略格式参数,让moment自动解析
如果你的输入是浏览器原生可识别的日期格式,也可以直接不传第二个格式参数,moment会自动尝试解析:
var testTime = moment('Thu Jun 27 2019 05:33:19 GMT+0000'); var startPeriod = moment('Thu Jun 27 2019 04:00:19 GMT+0000'); var endPeriod = moment('Thu Jun 27 2019 10:00:19 GMT+0000'); console.log(testTime.isBetween(startPeriod, endPeriod)); // 输出true
小提示:
以后用moment解析日期时,建议先调用isValid()验证解析结果,这样能快速定位解析失败的问题,避免后续的异常行为。
内容的提问来源于stack exchange,提问作者timcallagy
相关产品推荐
相关产品推荐

