Подтвердить что ты не робот

Safari Дата Javascript() NaN Issue (yyyy-MM-dd HH: mm: ss)

Мой код работает правильно в Google Chrome, но не в Safari.

Я понял, что мне нужно преобразовать yyyy-MM-dd HH:mm:ss в ISO 8601, но я не нашел решения для этого.


Онлайн-тестовая ссылка: http://jsfiddle.net/UVgHR/


JavaScript:

$(document).ready(function() {

    calculateMinutes();
    setInterval(calculateMinutes, 60000);

});

function calculateMinutes() {
    $('.calculateMinutes').each(function () {
        var diff = Math.abs(new Date( $(this).data('timestamp') ) - new Date());
        var minutes = Math.floor((diff/1000)/60);
        $(this).html( minutes + ' min.' );
    });
}

Пример HTML:

<span class="calculateMinutes" data-timestamp="2014-02-18 15:00:48">
4b9b3361

Ответ 1

Чтобы облегчить вашу проблему, выполните следующие действия:

new Date('2014-02-18 15:00:48')

Эта работа в хром, но не в сафари. В mdn говорится о поддержке формата ECMAScript 5 ISO-8601:

В качестве альтернативы строка даты/времени может быть в формате ISO 8601. Для Например, "2011-10-10" (только дата) или "2011-10-10T14: 48: 00" (дата и время) может быть передано и проанализировано.

Если вы включили T, он работает:

new Date('2014-02-18T15:00:48')

Вы можете использовать new Date('2014-02-18T15:00:48'.replace(/\s/, 'T')).

Если вы справитесь со многими подобными случаями, я рекомендую использовать moment, который, похоже, очень хорошо справляется с этим случаем с T или без него: синтаксический анализ из строки. Кроме того, весь ваш пример проще с помощью momentjs:

var minutes = moment().diff("2014-02-18 15:00:48", 'minutes');

Ответ 2

Я видел такую ​​проблему раньше, и что для меня работает, - это заменить пространство между датой и временем на T. Попробуйте следующее:

Обновлен JavaScript:

function calculateMinutes() {
    $('.calculateMinutes').each(function () {
        var timestamp = $(this).data('timestamp').replace(' ', 'T');
        var diff = Math.abs(new Date(timestamp) - new Date());
        var minutes = Math.floor((diff / 1000) / 60);
        $(this).html(minutes + ' min.');
    });
}

JSFiddle здесь.

Ответ 3

Я думаю, что Хосе пропустил один пункт здесь. Не забудьте включить Z, иначе будет временной интервал.

новая дата ('2014-02-18T15: 00: 48') новая дата ('2014-02-18T15: 00: 48Z')

Вы можете использовать new Date('2014-02-18T15:00:48'.replace(/\s/, 'T')+'Z').

Обратитесь к этому за дополнительной информацией - новая дата() работает по-разному в Chrome и Firefox