使用JavaScript计算当前与用户输入时间小时差时出现NaN问题求助
解决JavaScript计算日期时间差返回NaN的问题
你遇到的NaN问题,根源在于日期时间字符串的格式错误,导致new Date()无法正确解析出有效的时间对象,后续的差值计算自然就会得到NaN。我帮你梳理下代码里的问题点,再给出修正后的方案:
问题分析
timeStart的创建错误:
你把todayToDate(这是一个时间戳数字)和strTime直接拼接,得到的是类似155398080000012:30 pm的无效字符串,new Date()根本无法解析这种格式,所以timeStart会变成Invalid Date。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
相关产品推荐
相关产品推荐

