JavaScript不同日期格式比较出错,如何转换为标准格式实现正确比较?
如何正确比较不同格式的日期字符串?
你现在遇到的问题我之前也踩过类似的坑!直接拿日期字符串比大小根本不靠谱,核心原因是:字符串比较是按字典序而非实际时间顺序来判断的,这就会出现不符合时间逻辑的错误结果。
比如你的date3是"2018/04/12 21:54:40",date2是"4/12/2018 9:52:51 PM"——字符串对比时,第一个字符"2"的ASCII码小于"4",所以会判定date3 < date2,但实际date3的时间明显更晚,这就是错误的根源。而date2和date1碰巧开头格式一致,字符串的字典序刚好和时间顺序匹配,所以得到了正确结果,但这完全是巧合,绝对不能依赖这种方式。
正确的解决方式:转成Date对象再比较
JavaScript的Date对象会基于时间戳来判断大小,这才是符合时间逻辑的比较方式。直接用new Date()构造函数就能解析大多数常见的日期格式:
var date1 = "4/12/2018 9:52:21 PM"; var date2 ="4/12/2018 9:52:51 PM"; var date3 ="2018/04/12 21:54:40"; // 转换为Date对象 const dt1 = new Date(date1); const dt2 = new Date(date2); const dt3 = new Date(date3); // 现在进行比较 const dateCondition1 = dt3 > dt2; const dateCondition2 = dt2 > dt1; alert(dateCondition1); // 现在返回true,符合实际时间逻辑 alert(dateCondition2); // 依然返回true,结果正确
特殊情况:手动解析不兼容的日期格式
如果遇到某些浏览器对特定日期格式(比如非标准的地区格式)解析有问题,你可以手动拆分字符串来构造Date对象。比如针对MM/DD/YYYY hh:mm:ss AM/PM这种格式:
function parseUSDateFormat(dateStr) { // 拆分日期、时间和AM/PM部分 const [dateSection, timeSection, period] = dateStr.split(/\s+/); // 拆分月、日、年 const [month, day, year] = dateSection.split('/').map(Number); // 拆分时、分、秒 let [hours, minutes, seconds] = timeSection.split(':').map(Number); // 处理12小时制转24小时制 if (period === 'PM') { hours = hours === 12 ? 12 : hours + 12; } else { hours = hours === 12 ? 0 : hours; } // 注意:Date对象的月份是从0开始的,所以要减1 return new Date(year, month - 1, day, hours, minutes, seconds); } // 使用自定义解析函数 const dt1 = parseUSDateFormat(date1); const dt2 = parseUSDateFormat(date2);
总结
直接比较日期字符串的方式完全不正确,因为字符串比较遵循的是字典序,和实际时间顺序没有必然关联。只有将日期字符串转换为Date对象后再进行比较,才能得到符合时间逻辑的正确结果。
内容的提问来源于stack exchange,提问作者Kurkula
相关产品推荐
相关产品推荐

