JavaScript中DD-MM-YYYY格式的字符串日期如何正确比较?
问题解决思路
你提前对moment日期对象调用了
format()方法转成了DD-MM-YYYY格式的字符串,原生Date构造器无法可靠解析这种格式的字符串,不同浏览器会出现解析规则混乱、返回非法日期的问题,所以转换失败导致比较失效。
下面是3种可直接使用的解决方案,按推荐优先级排序:
- 方法1:直接使用moment内置的日期比较方法(最推荐,无额外转换开销)
完全不需要提前调用format()转字符串,直接用原始moment对象比较即可,moment内置了isBefore()/isAfter()/isSame()等多种比较方法:// 取消提前format,保留moment对象用于比较 const dateToCompare = moment.utc(endDate); const maximum = moment.utc(addDays(new Date(),14)); // 示例:判断dateToCompare是否早于maximum const isBeforeMax = dateToCompare.isBefore(maximum); // 示例:判断dateToCompare是否晚于maximum const isAfterMax = dateToCompare.isAfter(maximum); // 示例:判断两个日期是否精确到天相等 const isSame = dateToCompare.isSame(maximum, 'day'); - 方法2:已经拿到格式化后的
DD-MM-YYYY字符串的场景,用moment指定格式解析后比较// 按字符串的实际格式传入第二个参数,避免解析错误 const parsedCompareDate = moment(dateToCompare, 'DD-MM-YYYY'); const parsedMaxDate = moment(maximum, 'DD-MM-YYYY'); const isBeforeMax = parsedCompareDate.isBefore(parsedMaxDate); - 方法3:不依赖moment的原生JS实现方案
把DD-MM-YYYY字符串拆分后转为YYYYMMDD格式的数字,直接比较数字大小即可,不会出现解析歧义:function convertDateStrToNum(dateStr) { const [dd, mm, yyyy] = dateStr.split('-').map(Number); return yyyy * 10000 + mm * 100 + dd; } // 数字直接比较大小即可,小于代表更早,大于代表更晚,相等代表是同一天 const isBeforeMax = convertDateStrToNum(dateToCompare) < convertDateStrToNum(maximum);
内容的提问来源于stack exchange,提问作者iulia_g31
相关产品推荐
相关产品推荐

