Почему этот Javascript работает в FF3.6?новая дата («2010-06-09T19: 20: 30 + 01: 00»); - PullRequest
0 голосов
/ 17 июня 2010

Вот пример кода:

var d = new Date("2010-06-09T19:20:30+01:00");
document.write(d);

На FF3.6 это даст вам:

Ср 09 июня 2010 14:20:30 GMT-0400 (EST)

проверены другие браузеры; Chrome 5, Safari 4, IE7 дают:

Неверная дата

Я знаю, что поддержка дат ISO8601 ограничена, но кто-нибудь знает, в чем и / или где разница в FF3.6, которая позволяет этому работать?

Я думаю, что Ф.Ф. просто отбрасывает то, чего не понимает, а другие нет.

Кто-нибудь еще видел это и / или получал разные результаты из сценария тестирования?

Ответы [ 2 ]

1 голос
/ 17 июня 2010

ISO 8601 часто используется для передачи информации о времени / дате между системами.

Он допускает только гггг-мм-дд для полуночи по Гринвичу этой даты,

или даты, за которой следует 'T'и данные времени,

с дополнительными секундами и миллисекундами (после', ').

гггг-мм-ддчч: мм

гггг-мм-ддчч: мм:ss.xxx

Вы заканчиваете буквой Z для времени по Гринвичу, ничего, также для времени по Гринвичу, или + или - и смещением hh: mm от GMT.

Вы можете сделать свой собственныйmethod - это возвращает локальную дату, используя встроенный метод, если он доступен - пока только firefox.

Date.ISO= function(s){
    var D= new Date(s);
    if(D.getDate()) return D;

    var M= [], min= 0,
    Rx=  /([\d:]+)(\.\d+)?(Z|(([+\-])(\d\d):(\d\d))?)?$/;
    D= s.substring(0, 10).split("-");

    if(s.length> 11){
        M= s.substring(11).match(Rx) || [];
        if(M[1]) D= D.concat(M[1].split(":"));
        if(M[2]) D.push(Math.round(M[2]*1000));
    }
    D= D.map(function(itm){return parseInt(itm, 10);});
    D[1]-= 1;
    while(D.length < 7) D.push(0);
    if(M[4]){
        min= parseInt(M[6])*60 + parseInt(M[7], 10);
        if(M[5]== "+") min*= -1;
    }
    D= new Date(Date.UTC.apply(Date, D));
    if(!D.getDate()) throw "Bad Date- " + s;

    if(min) D.setMinutes(D.getMinutes()+ min);
    return D;
}

// tests

var s= "2010-06-09T19:20:30+01:00";
alert(Date.ISO(s).toUTCString());

/ * value:(Строка) Safari 5.0: ср., 09 июня 2010 г. 18:20:30 GMT

MSIE 8.0: ср., 9 июня 2010 г. 18:20:30 UTC

Chrome 5.0.375.70: ср.,09 июня 2010 18:20:30 GMT

Opera 10.53: ср, 09 июня 2010 18:20:30 GMT

Firefox 3.6.3: ср, 09 июня 2010 18:20:30GMT * /

Примечание. Для работы в IE (и более старых браузерах) вам необходимо:фальшивый метод карты массива-

if(![].map){
    Array.prototype.map= function(fun, scope){
        var L= this.length, A= Array(this.length), i= 0, val;
        if(typeof fun== 'function'){
            while(i< L){
                if(i in this){
                    A[i]= fun.call(scope, this[i], i, this);
                }
                ++i;
            }
            return A;
        }
    }
}
1 голос
/ 17 июня 2010

ECMAScript 5-е издание (см. §15.9.1.15) добавляет некоторую поддержку ISO-8601, и Mozilla, очевидно, прыгнула на него (возможно, это были даже те, кто его толкал). Я не думал, что они добавили его в конструктор, и поддержка должна быть немного упрощена, но это не значит, что Mozilla не может идти с духом, а не с буквой, и взять что-нибудь, что она может выяснить & mdash; или думает , что может понять. Фактический формат, поддерживаемый в спецификации, YYYY-MM-DDTHH:mm:ss.sssZ. Ваша дата выборки не совсем совпадает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...