Javascript возвращает NaN только в IOS браузерах - PullRequest
2 голосов
/ 15 апреля 2020

Я делаю этот веб-сайт калькулятора возраста, который использует объект Date в JS и, вычитая текущее время в миллисекундах и дату рождения пользователя в миллисекундах, рассчитывает их возраст в различных единицах (годах, месяцах, днях и т. Д. 1011). *.) и выводит его на 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.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Проблема в вашем коде состоит в том, что когда вы используете 2002 + '-' + 07 + '-' + 04, есть две проблемы: во-первых, когда вы определяете число с начальным нулем (0), оно считает, что число является восьмеричным целым, поэтому вы не можете иметь 09 или 08. Во-вторых, если вы оцените 2002 + '-' + 07 + '-' + 04, это будет 2002-7-4, что не является допустимой датой JS spe c документов, Chrome и Firefox достаточно умны, чтобы проанализировать эту строку как значение даты, но Safari считает это недопустимым значением. вместо этого вы можете сделать это:

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

Кроме того, вы определили birthday дважды, поэтому его нужно определить только один раз.

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

  birthday = Date.parse(birthday);
0 голосов
/ 15 апреля 2020

Вы передаете объект Date в Date.parse () , для которого требуется строка.

Ваш код:

birthday = new Date(formYear + '-' + formMonth + '-' + formDay);

birthday = Date.parse(birthday); // NaN

Измените последнюю строку на :

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

Обновление:

ОП отмечает, что проблема была в нестандартной строке даты, введенной в 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 :

dateString
Строка, представляющая собой упрощение расширенного формата календарной даты ISO 8601. (Могут использоваться и другие форматы, но результаты зависят от реализации.)

Даже с допустимой строкой даты для передачи в Date.parse, вам следует избегать использования Date.parse полностью, так как различные хосты анализируют дата строки по-разному. От MDN:

Не рекомендуется использовать Date.parse, поскольку до ES5 разбор строк полностью зависел от реализации. По-прежнему существует много различий в том, как разные хосты анализируют строки даты, поэтому строки даты следует анализировать вручную (библиотека может помочь, если нужно разместить много разных форматов).

...