JavaScript按日期时间从新到旧排序失效,求问题定位与解决
问题:自定义日期格式的对象数组无法正确按时间排序
原始对象数组:
const dateAndTime = [ { "createdAt": "20/02/2024, 16:13:51" }, { "createdAt": "20/02/2024, 16:15:23" }, { "createdAt": "18/02/2024, 14:27:31" }, { "createdAt": "18/02/2024, 15:41:06" }, { "createdAt": "21/03/2024, 22:09:35" }, { "createdAt": "07/03/2024, 17:24:19" }, ];
尝试的排序代码:
dateAndTime.sort((a, b) => { const dateA = new Date(a.createdAt); const dateB = new Date(b.createdAt); return dateB.getTime() - dateA.getTime(); }); console.log(dateAndTime);
实际排序未生效,预期最新的21/03/2024, 22:09:35应排在首位。
错误原因
new Date()无法可靠解析DD/MM/YYYY, HH:mm:ss这种格式。JavaScript的Date构造函数对非ISO 8601格式的日期解析依赖运行环境,大部分情况下会把DD/MM/YYYY误认为MM/DD/YYYY,当日期部分的日数超过12时(比如20/02或21/03),会解析出无效或错误的Date对象,导致getTime()返回的时间戳异常,排序逻辑失效。
解决方案
手动解析自定义格式的日期字符串,明确指定年、月、日等时间参数来构造准确的Date对象:
dateAndTime.sort((a, b) => { // 自定义解析函数:处理DD/MM/YYYY, HH:mm:ss格式 const parseCustomDate = (dateStr) => { // 拆分日期和时间部分 const [dateSegment, timeSegment] = dateStr.split(', '); // 拆分日、月、年(注意月份在Date中是0索引,需要减1) const [day, month, year] = dateSegment.split('/').map(Number); // 拆分时、分、秒 const [hours, minutes, seconds] = timeSegment.split(':').map(Number); // 构造准确的Date对象 return new Date(year, month - 1, day, hours, minutes, seconds); }; const dateA = parseCustomDate(a.createdAt); const dateB = parseCustomDate(b.createdAt); // 按时间戳倒序排序(新→旧) return dateB.getTime() - dateA.getTime(); }); console.log(dateAndTime);
这段代码通过手动拆分日期字符串的各个部分,避免了环境依赖的解析错误,构造出的Date对象时间戳准确,排序逻辑可以正常工作,最终会得到预期的从新到旧的排列结果。
内容的提问来源于stack exchange,提问作者Mo Miah
相关产品推荐
相关产品推荐

