调用日期计算函数时一维数组日期参数返回NaN问题分析
日期数组元素传入函数返回NaN的问题与解决
我修改了Cooper在2017年写的一段代码,使其支持参数传入。当使用从表格中提取的两个单独日期值调用getDaysHoursAndMinutes函数时,运行完全正常;但遍历表格提取的一维日期数组,用数组元素作为参数调用该函数时,却返回了NaN。
测试代码片段
console.log("orderOut :" + orderOut); console.log("orderIn :" + orderIn); console.log("assetOutOn:" + assetsOutOn[1]); function test() { var easyPeezee = getDaysHoursAndMinutes(orderOut, orderIn); console.log("easyPeezee:" + easyPeezee); var myResult = getDaysHoursAndMinutes(orderOut, assetsOutOn[1]); console.log("myResult :" + myResult); }
控制台输出
7:07:31 PM Info orderOut :Fri May 05 2023 00:00:00 GMT-0400 (Eastern Daylight Time) 7:07:31 PM Info orderIn :Mon May 08 2023 00:00:00 GMT-0400 (Eastern Daylight Time) 7:07:31 PM Info assetOutOn:Tue May 02 2023 00:00:00 GMT-0400 (Eastern Daylight Time) 7:07:31 PM Info easyPeezee:3 7:07:31 PM Info myResult :NaN
被调用的函数代码
function getDaysHoursAndMinutes(hd, td) { //var hd=new Date('2022-11-21T20:23:26+0000').valueOf(); //var td=new Date().valueOf(); var sec = 1000; var min = 60 * sec; var hour = 60 * min; var day = 24 * hour; var diff = td - hd; var days = Math.floor(diff / day); var hours = Math.floor(diff % day / hour); var minutes = Math.floor(diff % day % hour / min); //Logger.log('%s days %s hours %s minutes', days, hours, minutes); return days; }
解决方法
问题核心是数组中的日期元素并非可直接运算的时间戳数值,即使控制台打印的格式和单独日期一致,其内部可能是字符串或未正确初始化的对象,直接做减法会得到NaN。
取消注释函数开头的两行代码,并修改为基于传入参数获取时间戳即可:
function getDaysHoursAndMinutes(hd, td) { hd = new Date(hd).valueOf(); td = new Date(td).valueOf(); var sec = 1000; var min = 60 * sec; var hour = 60 * min; var day = 24 * hour; var diff = td - hd; var days = Math.floor(diff / day); var hours = Math.floor(diff % day / hour); var minutes = Math.floor(diff % day % hour / min); //Logger.log('%s days %s hours %s minutes', days, hours, minutes); return days; }
显式通过new Date().valueOf()将参数转换为时间戳数值后,减法运算就能正常执行,返回预期的天数结果。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

