Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Анализ даты Javascript JSON в IE7/IE8 возвращает NaN

Автор вопроса: JosiahОтветов: 5

Я анализирую дату из ленты событий JSON, но дата показывает "NaN" в IE7/8:

// Variable from JSON feed (using JQuery's $.getJSON)
var start_time = '2012-06-24T17:00:00-07:00';

// How I'm currently extracting the Month & Day
var d = new Date(start_time);
var month = d.getMonth();
var day = d.getDate();

document.write(month+'/'+day);// "6/24" in most browsers, "Nan/Nan" in IE7/8

Что я делаю неправильно? Спасибо!

  • он не поддерживается в IE7/8. Используйте мс с эпохи или прокладку. Esailija 13.06.2012
  • Я очень рекомендую использовать DateJS здесь... Andrew Whitaker 13.06.2012
  • См. также: Какие браузеры поддерживают анализ строки даты ISO-8601 с помощью Date.parse? Myrne Stol 21.05.2013

javascriptdateutcinternet-explorer-8internet-explorer-7

Ответы

Ответ 1 · рейтинг 67 · kennebec

В старых браузерах вы можете написать функцию, которая будет анализировать строку за вас.

Этот создает метод Date.fromISO - если браузер может изначально получить правильную дату из строки ISO, используется собственный метод.

Некоторые браузеры частично поняли это правильно, но вернули неверный часовой пояс, поэтому простая проверка на NaN может не сработать.

Полифилл:

(function(){
    var D= new Date('2011-06-02T09:34:29+02:00');
    if(!D || +D!== 1307000069000){
        Date.fromISO= function(s){
            var day, tz,
            rx=/^(\d{4}\-\d\d\-\d\d([tT ][\d:\.]*)?)([zZ]|([+\-])(\d\d):(\d\d))?$/,
            p= rx.exec(s) || [];
            if(p[1]){
                day= p[1].split(/\D/);
                for(var i= 0, L= day.length; i<L; i++){
                    day[i]= parseInt(day[i], 10) || 0;
                };
                day[1]-= 1;
                day= new Date(Date.UTC.apply(Date, day));
                if(!day.getDate()) return NaN;
                if(p[5]){
                    tz= (parseInt(p[5], 10)*60);
                    if(p[6]) tz+= parseInt(p[6], 10);
                    if(p[4]== '+') tz*= -1;
                    if(tz) day.setUTCMinutes(day.getUTCMinutes()+ tz);
                }
                return day;
            }
            return NaN;
        }
    }
    else{
        Date.fromISO= function(s){
            return new Date(s);
        }
    }
})()

Результат:

var start_time = '2012-06-24T17:00:00-07:00';
var d =  Date.fromISO(start_time);
var month = d.getMonth();
var day = d.getDate();

alert(++month+' '+day); // returns months from 1-12

Ответ 2 · рейтинг 25 · fbtb

Для ie7/8 я только что сделал:

var ds = yourdatestring;
ds = ds.replace(/-/g, '/');
ds = ds.replace('T', ' ');
ds = ds.replace(/(\+[0-9]{2})(\:)([0-9]{2}$)/, ' UTC\$1\$3');
date = new Date(ds);

Это заменяет все вхождения "-" на "/", маркер времени "T" на пробел и заменяет информацию о часовом поясе строкой, удобной для IE, которая позволяет IE7/8 правильно анализировать даты из строк. Решил все вопросы за меня.

Ответ 3 · рейтинг 5 · Estin Chin

См. сообщение RobG по адресу Результат toJSON ( ) в дату различается между IE8 и IE9+.

Ниже функция работала для меня в IE 8 и ниже.

// parse ISO format date like 2013-05-06T22:00:00.000Z
function convertDateFromISO(s) {
  s = s.split(/\D/);
  return new Date(Date.UTC(s[0], --s[1]||'', s[2]||'', s[3]||'', s[4]||'', s[5]||'', s[6]||''))
}

Вы можете протестировать, как показано ниже:

var currentTime = new Date(convertDateFromISO('2013-05-06T22:00:00.000Z')).getTime();
alert(currentTime);

Ответ 4 · рейтинг 3 · gib

Я предлагаю http://momentjs.com/ для проблем с датой в разных браузерах.

Ответ 5 · рейтинг 1 · William Smith

@gib Спасибо за предложение по Moment.js. Эта небольшая библиотека действительно помогает при работе с датами и JavaScript.

Moment.js решил проблему, описанную в исходном вопросе, который у меня тоже был. IE8 отображал даты JSON ISO как NaN при анализе в новый объект Date().

Быстрое решение (включите moment.js на свою страницу или скопируйте код в свои функции js)

Если вам просто нужно отобразить на странице дату, загруженную из даты в формате JSON ISO, сделайте следующее:

order_date = moment(data.OrderDate); //create a "moment" variable, from the "data" object in your JSON function in Protoype or jQuery, etc.

$('#divOrderDate).html(order_date.calendar()); //use Moment's relative date function to display "today", "yesterday", etc.

or

order_date = moment(data.OrderDate); //create a "moment" variable, from the "data" object in your JSON function in Protoype or jQuery, etc.

$('#divOrderDate).html(order_date.format('m/d/YYYY')); //use Moment's format function to display "2/6/2015" or "10/19/2014", etc.

Если у вас должен быть объект Date() (например, для использования с компонентами jQuery), выполните следующие действия, чтобы успешно заполнить предоставленную JSON дату в формате ISO. (Это предполагает, что вы уже находитесь внутри функции обработки данных JSON.)

var ship_date = new Date(moment(data.ShipDate).format('m/d/YYYY'));  //This will successfully parse the ISO date into JavaScript's Date() object working perfectly in FF, Chrome, and IE8.

//initialize your Calendar component with the "ship_date" variable, and you won't see NaN again.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы