Как заставить Internet Explorer анализировать «2010-06-09T15: 20: 00Z» как дату? - PullRequest
0 голосов
/ 16 августа 2011

Я использую JavaScript для работы с датами в комбинированном формате UTC (например, «2010-06-09T15: 20: 00Z»).IE не дает ожидаемых результатов (шок).Следующее дает NaN.

var d = new Date("2010-06-09T15:20:00Z");  // NaN

Однако в документации Microsoft на этой странице сказано, что это должно работать (как в FF).Я даже скопировал код JScript с этой страницы, и он не работает, выдавая ту же ошибку, которую я обнаружил в своей работе.(Вид заставляет задуматься, проверяет ли MS это перед публикацией или IE не работает из-за патча).

Форматирование строки даты и времени (msdn.microsoft.com)

Я могу заставить IE анализировать подобные строки, удалив 'T' и переключив дефисы на косые черты.Проблема в том, что я теряю логику смещения времени.

Любые предложения о том, как обойти эту проблему в IE.Я проверил это в IE6 и IE7 (режим совместимости).У меня нет другой системы Windows для проверки.

Ответы [ 3 ]

0 голосов
/ 16 августа 2011
Date.fromISO= (function(){
    var diso= Date.parse('2011-04-26T13:16:50Z');
    if(diso=== 1303823810000) return function(s){
        return new Date(Date.parse(s));
    }
    else return 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/).map(function(itm){
                return parseInt(itm, 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;
    }
})()
0 голосов
/ 16 августа 2011

Я смущаюсь мыслью о расширении основных объектов Javascript, поэтому вместо этого склоняюсь к работе с ними. Полный кредит Пола Соудена

    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
        "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
        "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
    var d = string.match(new RegExp(regexp));

    var offset = 0;
    var time;
    var date = new Date(d[1], 0, 1);

    if (d[3]) { date.setMonth(d[3] - 1); }
    if (d[5]) { date.setDate(d[5]); }
    if (d[7]) { date.setHours(d[7]); }
    if (d[8]) { date.setMinutes(d[8]); }
    if (d[10]) { date.setSeconds(d[10]); }
    if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
    if (d[14]) {
        offset = (Number(d[16]) * 60) + Number(d[17]);
        offset *= ((d[15] == '-') ? 1 : -1);
    }

    offset -= date.getTimezoneOffset();
    time = (Number(date) + (offset * 60 * 1000));
    date.setTime(Number(time));
0 голосов
/ 16 августа 2011

Для беспроблемной манипуляции с датами мне нравится использовать Datejs - библиотека дат JavaScript с открытым исходным кодом , она делает много замечательных вещей с датами, основной ценой использования которых считается размер файла 26 КБ.

будет разбирать "2010-06-09T15:20:00Z"

...