日期与最小/最大值比较功能失效问题求助
问题排查与修复方案
嘿,我帮你找到问题所在了!你的代码里有两个关键错误,导致每次调用checkValidDate都返回null:
1. 数字与字符串的无效比较
你把minDate和dueDate用format('DD-MM-YYYY')转成了字符串格式(比如"01-05-2024"),但Date.parse(date)返回的是时间戳数字(比如1714521600000)。JavaScript中数字和字符串直接比较时,会尝试把字符串转成数字,但DD-MM-YYYY这种格式无法被Date.parse正确解析(它默认识别美式MM-DD-YYYY或ISO格式),转出来的结果要么是NaN,要么是完全错误的时间值,导致比较逻辑彻底失效。
2. 逻辑判断方向错误
原代码的条件if (Date.parse(date) > minDate || Date.parse(date) < dueDate)逻辑完全搞反了:你本来想检查日期是否在minDate(10年前)和dueDate(10年后)之间,但这个条件的意思是「只要日期大于min 或者 小于due就返回date」——理论上所有日期都满足这个条件,但因为前面的类型比较错误,这个判断永远为false,所以每次都走return null。
修复后的代码(推荐用Moment.js原生比较)
我们可以直接用Moment.js的对象来做比较,既避免格式解析错误,又让逻辑更清晰:
// 保留Moment对象,不要转成字符串 var dueDate = moment().add(10, 'years'); var minDate = moment().add(-10, 'years'); var checkValidDate = function(date) { // 必须指定解析格式,确保DD-MM-YYYY被正确识别 var inputDate = moment(date, 'DD-MM-YYYY'); // 检查日期是否在[minDate, dueDate]区间内(包含边界) if (inputDate.isBetween(minDate, dueDate, null, '[]')) { return date; // 也可以返回inputDate.format('DD-MM-YYYY'),看你的需求 } return null; }
另一种方案:用时间戳数字比较
如果你偏好使用时间戳,也可以这么写:
// 转成时间戳数字(毫秒级) var dueDate = moment().add(10, 'years').valueOf(); var minDate = moment().add(-10, 'years').valueOf(); var checkValidDate = function(date) { // 指定解析格式后转成时间戳 var inputTimestamp = moment(date, 'DD-MM-YYYY').valueOf(); // 正确逻辑:日期在min和due之间则返回date,否则返回null if (inputTimestamp >= minDate && inputTimestamp <= dueDate) { return date; } return null; }
关键注意点
- 永远不要用
Date.parse解析DD-MM-YYYY格式的日期,一定要用moment(date, 'DD-MM-YYYY')来确保解析正确。 - 用于比较的基准日期(minDate、dueDate)不要转成字符串,保留Moment对象或时间戳才能进行有效比较。
内容的提问来源于stack exchange,提问作者smith John
相关产品推荐
相关产品推荐

