【问题标题】:Javascript returns NaN only in IOS browsersJavascript 仅在 IOS 浏览器中返回 NaN
【发布时间】:2020-07-27 19:17:27
【问题描述】:

我正在制作这个年龄计算器网站,它使用 JS 中的 Date 对象,并通过减去当前时间(以毫秒为单位)和用户的出生日期(以毫秒为单位)计算他们以不同单位(年、月、日等)的年龄并输出它到 html。

它在 windows 和 android 上是完全可用的,但是,当网站在 IOS 中加载时,它返回 NaN。我不知道它是否与 parseInt() 函数或在这两个平台中自动完成而在 IOS 中没有完成的事情有关。这里是网站供参考:https://hesamzakeri.ir/en/

    <div id="years"></div>
    <div id="months"></div>
    <div id="days"></div>
    <div id="hours"></div>
    <div id="minutes"></div>
    <div id="seconds"></div>

<script>
    let currentTime = Date.now();

    let birthday = new Date(2002 + '-' + 07 + '-' + 04); // example

    let birthday = Date.parse(birthday);

    let age = currentTime - birthday;

    let yearsOld = parseInt(age / 1000 / 60 / 60 / 24 / 365, 10);

    let yearsOldInMs = yearsOld * 365 * 24 * 60 * 60 * 1000;

    let monthsOld = parseInt((age - yearsOldInMs) / 1000 / 60 / 60 / 24 / 30.417, 10);

    let monthsOldInMs = monthsOld * 30.417 * 24 * 60 * 60 * 1000;

    let daysOld = parseInt((age - (yearsOldInMs + monthsOldInMs)) / 1000 / 60 / 60 / 24, 10);

    let daysOldInMs = daysOld * 24 * 60 * 60 * 1000;

    let hoursOld = parseInt((age - (yearsOldInMs + monthsOldInMs + daysOldInMs)) / 1000 / 60 / 60, 10);

    let hoursOldInMs = hoursOld * 60 * 60 * 1000;

    let minutesOld = parseInt((age - (yearsOldInMs + monthsOldInMs + daysOldInMs + hoursOldInMs)) /
                1000 /
                60,
            10
        );

    let minutesOldInMs = minutesOld * 60 * 1000;

    let secondsOld = parseInt(
            (age -
                (yearsOldInMs +
                    monthsOldInMs +
                    daysOldInMs +
                    hoursOldInMs +
                    minutesOldInMs)) /
                1000,
            10
        );
</script>

这是计算年龄的部分之一。我省略了 JS 中不必要的部分,例如它将结果输出到 HTML 的位置。

【问题讨论】:

    标签: javascript html ios web nan


    【解决方案1】:

    您将 Date 对象传递给 Date.parse(),这需要一个字符串。

    您的代码:

    birthday = new Date(formYear + '-' + formMonth + '-' + formDay);
    
    birthday = Date.parse(birthday); // NaN
    

    将最后一行改为:

    birthday = Date.parse(birthday.toString());
    

    更新:

    OP 认为问题出在new Date() 的非标准日期字符串输入,而不是对Date.parse() 的调用。

    日期字符串输入已修复,但对Date.parse() 的调用仍然是错误的(尽管某些浏览器可能仍然可以使用它)。

    // this is correct
    birthday = new Date(2001, 2, 4);
    console.log(typeof birthday); // object
    
    // this is NOT correct, argument to Date.parse is type 'object'
    // (Date.parse argument must be type 'string')
    birthday = Date.parse(birthday);
    
    // this is what you want:
    let birthTime = birthday.getTime();
    

    Date.parse 需要一个字符串参数,来自MDN:

    日期字符串
    一个字符串,表示 ISO 8601 日历日期扩展格式的简化。 (可以使用其他格式,但结果取决于实现。)

    即使将有效的日期字符串传递给 Date.parse,您也应该完全避免使用 Date.parse,因为不同的主机解析日期字符串的方式不同。来自 MDN:

    不建议使用Date.parse,因为在 ES5 之前,字符串的解析完全依赖于实现。不同主机解析日期字符串的方式仍有很多差异,因此应手动解析日期字符串(如果要适应许多不同的格式,库可以提供帮助)。

    【讨论】:

    • 不,问题是这种放置日期的格式不在官方的 JS 规范中。不过还是谢谢你
    • 代码还是错误的,需要修复Date.parse这一行。请参阅上面的更新。
    • 哦,我不知道 Date.parse 的危险!谢谢,我会使用 getTime 方法。
    【解决方案2】:

    您的代码中的问题是,当您使用2002 + '-' + 07 + '-' + 04 时有两个问题,首先,当您定义一个带有前导零(0)的数字时,它认为该数字是一个八进制整数,所以您不能喜欢09 或 08。 其次,如果您评估 2002 + '-' + 07 + '-' + 04 它将是 2002-7-4,这不是 JS 规范文档的有效日期,Chrome 和 Firefox 足够聪明,可以将此字符串解析为日期值,但 Safari 认为这是一个无效值。 你可以这样做:

    let birthday = new Date(2002,7,4);
    
    

    另外,你定义了两次birthday,所以它只需要定义一次。

      let birthday = new Date(2002,7,4); // example
    
      birthday = Date.parse(birthday);
    

    【讨论】:

    • 是的,它有效,谢谢,我没有意识到不同的浏览器是不同的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    相关资源
    最近更新 更多