Javascript仅在IOS浏览器中返回NaN
我正在制作这个年龄计算器网站,它使用JS中的Date对象,通过减去当前时间(以毫秒为单位)和用户的出生日期(以毫秒为单位),以不同的单位(年、月、日等)计算他们的年龄,并将其输出到html 它在windows和android上完全可用,但是,当网站加载到IOS时,它返回NaN。我不知道这是否与parseInt()函数有关,或者与在这两个平台中自动完成的、在IOS中没有完成的操作有关。以下是供参考的网站:Javascript仅在IOS浏览器中返回NaN,javascript,html,ios,web,nan,Javascript,Html,Ios,Web,Nan,我正在制作这个年龄计算器网站,它使用JS中的Date对象,通过减去当前时间(以毫秒为单位)和用户的出生日期(以毫秒为单位),以不同的单位(年、月、日等)计算他们的年龄,并将其输出到html 它在windows和android上完全可用,但是,当网站加载到IOS时,它返回NaN。我不知道这是否与parseInt()函数有关,或者与在这两个平台中自动完成的、在IOS中没有完成的操作有关。以下是供参考的网站: 让currentTime=Date.now(); 生日=新的日期(2002+'-'+07+
让currentTime=Date.now();
生日=新的日期(2002+'-'+07+'-'+04);//例子
让生日=Date.parse(生日);
让年龄=当前时间-生日;
let YearSeld=parseInt(年龄/1000/60/60/24/365,10);
设yearsOldInMs=yearseld*365*24*60*60*1000;
设monthsOld=parseInt((年龄-岁soldinms)/1000/60/60/24/30.417,10);
设monthsOldInMs=monthsOld*30.417*24*60*60*1000;
let Daysaled=parsint((年龄-(年soldinms+月soldinms))/1000/60/60/24,10);
设daysOldInMs=daysaled*24*60*60*1000;
设hoursOld=parseInt((年龄-(年soldinms+月soldinms+日soldinms))/1000/60/60,10);
设hoursOldInMs=hoursOld*60*60*1000;
let minutesOld=parseInt((年龄-(年soldinms+月soldinms+日soldinms+小时soldinms))/
1000 /
60,
10
);
minutesOldInMs=minutesOld*60*1000;
设secondsell=parseInt(
(年龄-
(一年)+
蒙索丁斯+
日光浴+
小时数+
分钟(秒)/
1000,
10
);
这是它计算年龄的一部分。我省略了JS中不必要的部分,例如它将结果输出到HTML的位置。您将日期对象传递到其中,这需要一个字符串 您的代码:
birthday = new Date(formYear + '-' + formMonth + '-' + formDay);
birthday = Date.parse(birthday); // NaN
将最后一行更改为:
birthday = Date.parse(birthday.toString());
更新:
OP评论说问题出在new date()
的非标准日期字符串输入上,而不是调用date.parse()
日期字符串输入已修复,但对date.parse()
的调用仍然错误(尽管某些浏览器可能仍然可以使用它)
Date.parse需要一个字符串参数,来自:
日期字符串表示ISO 8601日历日期扩展格式简化的字符串。(可以使用其他格式,但结果取决于实现。) 即使要将有效的日期字符串传递给date.parse,也应该避免完全使用date.parse,因为不同的主机解析日期字符串的方式不同。来自MDN: 不建议使用
Date.parse
,因为在ES5之前,字符串的解析完全依赖于实现。在不同的主机解析日期字符串的方式上仍然存在许多差异,因此应该手动解析日期字符串(如果要容纳许多不同的格式,库可以提供帮助)
代码中的问题是,当您使用
2002+'-'+07+'-'+04
时,有两个问题,首先,当您使用前导零(0)定义一个数字时,它认为该数字是一个八进制整数,因此您不能使用like09
或08
。
其次,如果您评估2002+'-'+07+'-'+04
,它将是2002-7-4
,根据JS规范文档,这不是一个有效的日期,Chrome和Firefox足够聪明,可以将该字符串解析为日期值,但Safari认为这是一个无效的值。
您可以这样做:
let birthday = new Date(2002,7,4);
另外,您定义了两次生日
,因此只能定义一次
let birthday = new Date(2002,7,4); // example
birthday = Date.parse(birthday);
不,问题是这个日期格式不在正式的JS规范中。但无论如何,谢谢您代码仍然是错误的,您需要修复
Date.parse
行。看我上面的更新。哦,我不知道Date.parse的危险!谢谢,我将使用getTime方法。是的,它很有效,谢谢。我没有意识到不同的浏览器有这么大的不同。
let birthday = new Date(2002,7,4);
let birthday = new Date(2002,7,4); // example
birthday = Date.parse(birthday);