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

使用JavaScript计算当前与用户输入时间小时差时出现NaN问题求助

解决JavaScript计算日期时间差返回NaN的问题

你遇到的NaN问题,根源在于日期时间字符串的格式错误,导致new Date()无法正确解析出有效的时间对象,后续的差值计算自然就会得到NaN。我帮你梳理下代码里的问题点,再给出修正后的方案:

问题分析

  1. timeStart的创建错误:
    你把todayToDate(这是一个时间戳数字)和strTime直接拼接,得到的是类似155398080000012:30 pm的无效字符串,new Date()根本无法解析这种格式,所以timeStart会变成Invalid Date。
  2. timeEnd的创建错误:
    mydate是03-31-2019,dep_time是12:30PM,你直接把它们拼接成03-31-201912:30PM,日期和时间之间没有空格,这也是不符合规范的日期格式,同样会导致timeEnd变成Invalid Date。

修正后的代码

我调整了代码逻辑,直接通过Date对象的方法来构建时间,避免字符串解析的兼容性问题:

var user_date = '31-03-2019';
var dep_time='12:30PM';

// 解析用户输入的日期:dd-mm-yyyy → 转换为Date对象需要的年/月/日(注意月份是0开始)
var datePieces = user_date.split("-");
var userDateObj = new Date(datePieces[2], datePieces[1] - 1, datePieces[0]);

// 解析用户输入的时间:处理AM/PM转换为24小时制
var timePieces = dep_time.split(/:|(?=[AP]M)/); // 拆分出小时、分钟、AM/PM标识
var hours = parseInt(timePieces[0]);
var minutes = parseInt(timePieces[1]);
var ampm = timePieces[2];

// 转换为24小时制规则
if (ampm === 'PM' && hours !== 12) {
    hours += 12;
}
if (ampm === 'AM' && hours === 12) {
    hours = 0;
}
// 将解析后的时间设置到用户日期对象上
userDateObj.setHours(hours, minutes, 0, 0);

// 获取当前时间对象
var now = new Date();

// 计算时间差并输出
if (userDateObj > now) {
    var diffMs = userDateObj - now;
    var diffHours = diffMs / (1000 * 60 * 60);
    // 可根据需求选择取整或保留小数
    alert(Math.floor(diffHours) + '小时(精确值:' + diffHours.toFixed(2) + '小时)');
} else {
    alert('输入的日期时间已过期');
}

关键改进点

  • 手动构建Date对象:不再依赖Date.parse和字符串拼接,避免不同浏览器对日期字符串的解析差异;
  • 正确处理AM/PM时间:手动转换为24小时制,确保时间设置准确;
  • 直接使用Date对象计算差值:两个Date对象直接相减得到毫秒差,再转换为小时,逻辑更清晰易维护。

内容的提问来源于stack exchange,提问作者satya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:43:07