如何计算两个日期的小时差?JS新手遇AM/PM格式返回NaN求助
解决JavaScript中AM/PM格式日期计算小时差出现NaN的问题
嘿,我来帮你排查这个问题!你遇到的NaN问题,根源在于浏览器的Date构造函数无法正确解析你用的那种带AM/PM的日期字符串格式。像'2018-02-12 03:00:00 AM'这种格式不属于标准的ISO 8601规范,不同浏览器对它的解析行为不一致,很多情况下会直接返回无效日期(Invalid Date),两个无效日期相减自然就得到NaN了。
下面给你两种可靠的解决办法:
方法一:手动解析AM/PM格式的日期字符串
我们可以写一个辅助函数,把带AM/PM的日期转换成24小时制,再创建有效的Date对象:
// 辅助函数:解析带AM/PM的日期字符串 function parseDateWithAMPM(dateStr) { // 拆分日期部分、时间部分和AM/PM标识 const [datePart, timePart, period] = dateStr.split(' '); // 拆分年月日(注意JS的月份是从0开始的) const [year, month, day] = datePart.split('-').map(Number); // 拆分时分秒 let [hours, minutes, seconds] = timePart.split(':').map(Number); // 处理AM/PM到24小时制的转换 if (period === 'PM') { hours = hours === 12 ? 12 : hours + 12; } else { // AM的情况 hours = hours === 12 ? 0 : hours; } // 创建并返回有效的Date对象 return new Date(year, month - 1, day, hours, minutes, seconds); } function calculateTime() { var d2 = parseDateWithAMPM('2018-02-12 03:00:00 AM'); var d1 = parseDateWithAMPM('2018-02-10 08:00:00 AM'); var seconds = (d2 - d1)/1000; var hours = seconds/3600; console.log(hours); // 输出43,正确的小时差 } calculateTime();
方法二:转换为标准ISO格式(简化版)
如果你不想写复杂的解析函数,也可以手动把日期字符串转换成浏览器能正确识别的ISO格式,先把AM/PM转换成24小时制,再把空格换成T:
function calculateTime() { // 手动转换AM/PM到24小时制,改成ISO格式 var d2 = new Date('2018-02-12T03:00:00'); // 03:00 AM就是24小时制的03:00 var d1 = new Date('2018-02-10T08:00:00'); // 08:00 AM就是24小时制的08:00 var seconds = (d2 - d1)/1000; var hours = seconds/3600; console.log(hours); // 同样输出43 } calculateTime();
关键提示
- 永远不要依赖
Date构造函数解析非标准格式的日期字符串,不同浏览器的解析结果差异很大; - 如果需要处理多种日期格式,手动解析或者使用成熟的日期库(比如Day.js)会更可靠。
内容的提问来源于stack exchange,提问作者user7596840
相关产品推荐
相关产品推荐

