NaN в некоторых браузерах

310
02 августа 2017, 18:59

Доброго дня! Такой код почему-то дает NaN в Safari. Как исправить?

function returnRoubles(roubles)
{
    if(roubles % 10 == 1 && (roubles == 1 || roubles > 20)) return "рубль";
    else if((roubles % 10 == 2 || roubles % 10 == 3 || roubles % 10 == 4) && (roubles < 10 || roubles > 20)) return "рубля";
    else return "рублей";
}
function returnCop(roubles)
{
    if((roubles % 10 == 1) && (roubles == 1 || roubles > 20)) return "копейку";
    else if((roubles % 10 == 2 || roubles % 10 == 3 || roubles % 10 == 4) && (roubles < 10 || roubles > 20)) return "копейки";
    else return "копеек";
}
function setText() {
    if(document.getElementById("cnt").innerHTML == "Ты накопил уже 0 рублей 0 копеек")
    {
        var curDate = new Date('<?php echo date("Y-m-d H:i:s"); ?>');
        var startDate  = new Date('<?php echo $main['startDate']; ?>');
        money = Math.floor(((curDate-startDate)*<?php echo $main['money']; ?>)/(864000));
    }
    else money = money + 1; 
    console.log("money: "+money);
    document.getElementById("cnt").innerHTML = "Ты накопил уже <br>"+Math.floor(money/100)+" "+returnRoubles(Math.floor(money/100))+" "+money%100+" "+returnCop(money%100);
    showMoney(money);
}
setText();
console.log("interval: "+<?php echo round(864000/$main['money']); ?>);
setInterval(setText,<?php echo round(864000/$main['money']); ?>);

На экран: Ты накопил уже NaN рублей NaN копеек

function setText() {
    if(document.getElementById("cnt").innerHTML == "Ты накопил уже 0 рублей 0 копеек")
    {
        var curDate = new Date('2017-08-01 16:30:51');
        var startDate  = new Date('2017-08-01 16:24:40');
        money = Math.floor(((curDate-startDate)*50)/(864000));
    }
    else money = money + 1; 
    console.log("money: "+money);
    document.getElementById("cnt").innerHTML = "Ты накопил уже <br>"+Math.floor(money/100)+" "+returnRoubles(Math.floor(money/100))+" "+money%100+" "+returnCop(money%100);
    showMoney(money);
}
setText();
console.log("interval: "+17280);
setInterval(setText,17280);

html:

<h1 class='ontimer' id='cnt'>Ты накопил уже 0 рублей 0 копеек</h1>
Answer 1

Проблема

Проблема специфична для Internet Explorer и Safari.

var date = new Date("2011-02-07");  
console.log(date);

или

var date = new Date("2011-02-07T11:05:00");  
console.log(date);

Если вы выполнили приведенные выше фрагменты кода в разных браузерах, вы увидите, что в IE вы получите «NaN», а в Safari вы получите «Invalid Date». Однако Firefox, Chrome и Opera выводят правильную дату.

Решение

Проблема заключается в том, что вы передаете требуемую дату объекту Date (). По какой-то причине и не спрашивайте меня, почему два вышеупомянутых браузера на удивление не поддерживают формат даты «yyyy-mm-dd» и поэтому терпят неудачу. Мне не удалось составить окончательный список поддерживаемых форматов дат, однако я могу сказать, что следующие форматы определенно поддерживаются во всех браузерах и будут советовать придерживаться одного из них, чтобы избежать ошибок:

Нужно заменить формат дат на следующий.

var d = new Date(2011, 01, 07); // yyyy, mm-1, dd
var d = new Date(2011, 01, 07, 11, 05, 00); // yyyy, mm-1, dd, hh, mm, ss
var d = new Date("02/07/2011"); // "mm/dd/yyyy"
var d = new Date("02/07/2011 11:05:00"); // "mm/dd/yyyy hh:mm:ss"
var d = new Date(1297076700000); // milliseconds
var d = new Date("Mon Feb 07 2011 11:05:00 GMT"); // ""Day Mon dd yyyy hh:mm:ss GMT/UTC

Полностью текст в оригинале: JavaScript new Date() Returning NaN in IE or Invalid Date in Safari

Answer 2

NaN - Not a Number Вы пытаетесь / получаете не число и пытаетесь использовать его как число. Попробуйте типизировать получаемые значения функцией parseInt. Больше всего вызывает подозрение $main['money'] возможно вы строковое значение используете в математических функциях.

READ ALSO
Найти ближний объект Unity

Найти ближний объект Unity

Всем приветУ меня вопрос

482
убрать пробелы из строки средствами c#

убрать пробелы из строки средствами c#

Как лучше написать код для удаления символов пробела из строки?

392
Как вызвать метод перед выбором новой строки?

Как вызвать метод перед выбором новой строки?

Есть datagridviewПри выборе строки грида отображается детализация по данной позиции на форме ниже в textBox - ах

290
Wpf + Prism навигация перерисовывает DataGridHeader Style?

Wpf + Prism навигация перерисовывает DataGridHeader Style?

Задавал вопрос с сообществе PrismBrian Lagunas уверяет, что это не проблема Prism

320