You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算两个日期的小时差?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:36:11