Существует ли строковый формат даты, который работает во всех браузерах и во всех населенных пунктах? - PullRequest
2 голосов
/ 20 февраля 2012

Существует ли строковый формат даты, из которого может быть построен объект Date (т. Е. new Date('date string')), который работает во всех браузерах и местах / часовых поясах?

Мы пробовали использовать формат предложил в спецификации HTML5 из yyyy-mm-ddThh:mm:ss+hh:mm, но столкнулся с проблемами с Safari и IE.Мы попытались использовать менее формальный формат mm/dd/yyyy hh:ss:mm, который работает, но, насколько мне известно, форматирование «месяц до дня» может быть неоднозначным, если в настройках вашего языка предполагается, что первое число будет днем ​​(неамериканские страны).Кроме того, он не привязывает часовой пояс, который может иметь проблемы с разными часовыми поясами.

Ответы [ 4 ]

3 голосов
/ 20 февраля 2012

Короче говоря, это почти невозможное обещание, поскольку реализация зависит от UA. Я бы порекомендовал использовать формат iso8601, так как в дальнейшем он будет стандартным, и для облегчения разбора даты используйте шим, который я написал для собственного использования:

(function() {

var d = window.Date,
    regexIso8601 = /^(\d{4}|\+\d{6})(?:-(\d{2})(?:-(\d{2})(?:T(\d{2}):(\d{2}):(\d{2})\.(\d{1,3})(?:Z|([\-+])(\d{2}):(\d{2}))?)?)?)?$/;

if (d.parse('2011-11-29T15:52:30.5') !== 1322581950500 ||
    d.parse('2011-11-29T15:52:30.52') !== 1322581950520 ||
    d.parse('2011-11-29T15:52:18.867') !== 1322581938867 ||
    d.parse('2011-11-29T15:52:18.867Z') !== 1322581938867 ||
    d.parse('2011-11-29T15:52:18.867-03:30') !== 1322594538867 ||
    d.parse('2011-11-29') !== 1322524800000 ||
    d.parse('2011-11') !== 1320105600000 ||
    d.parse('2011') !== 1293840000000) {

    d.__parse = d.parse;

    d.parse = function(v) {

        var m = regexIso8601.exec(v);

        if (m) {
            return Date.UTC(
                m[1],
                (m[2] || 1) - 1,
                m[3] || 1,
                m[4] - (m[8] ? m[8] + m[9] : 0) || 0,
                m[5] - (m[8] ? m[8] + m[10] : 0) || 0,
                m[6] || 0,
                ((m[7] || 0) + '00').substr(0, 3)
            );
        }

        return d.__parse.apply(this, arguments);

    };
}

d.__fromString = d.fromString;

d.fromString = function(v) {

    if (!d.__fromString || regexIso8601.test(v)) {
        return new d(d.parse(v));
    }

    return d.__fromString.apply(this, arguments);
};

})();

Теперь вместо этого используйте Date.fromString(....), и все будут счастливы в стране ОЗ!

работает во всех основных браузерах, используются следующие ссылки:

http://dev.w3.org/html5/spec/common-microsyntaxes.html

http://www.ecma -international.org / ECMA-262 / 5,1 / # втор-15.9.1.15

http://msdn.microsoft.com/en-us/library/windows/apps/ff743760(v=vs.94).aspx

http://msdn.microsoft.com/en-us/library/windows/apps/wz6stk2z(v=vs.94).aspx

http://msdn.microsoft.com/en-us/library/windows/apps/k4w173wk(v=vs.94).aspx

https://connect.microsoft.com/IE/feedback/details/723740/date-parse-and-new-date-fail-on-valid-formats

надеюсь, это поможет -ck

ОБНОВЛЕНИЕ: (21.01.2013)

Следует отметить, что поведение того, что считается "совместимым со стандартами поведением", изменится с ECMAScript-262 v5.1 на ECMAScript-262 v6.0. Смотри: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-15.9.1.15

Язык изменился с: Значение смещения отсутствующего часового пояса равно «Z». до Если смещение часового пояса отсутствует, дата-время интерпретируется как местное время.

В настоящее время рассмотрено следующее: Chrome, Opera и Mobile Safari следуют ES5.1, тогда как IE10, Firefox и настольное Safari, похоже, следуют ES6. Так что сейчас это своего рода раздельное решение ... Итак, должна быть вторая версия этого скрипта, соответствующая стандарту ES6, и вот вам:

(function() {

    var d = window.Date,
        regexIso8601 = /^(\d{4}|\+\d{6})(?:-(\d{2})(?:-(\d{2})(?:T(\d{2}):(\d{2}):(\d{2})\.(\d{1,})(Z|([\-+])(\d{2}):(\d{2}))?)?)?)?$/,
        lOff, lHrs, lMin;

    if (d.parse('2011-11-29T15:52:30.5') !== 1322599950500 ||
        d.parse('2011-11-29T15:52:30.52') !== 1322599950520 ||
        d.parse('2011-11-29T15:52:18.867') !== 1322599938867 ||
        d.parse('2011-11-29T15:52:18.867Z') !== 1322581938867 ||
        d.parse('2011-11-29T15:52:18.867-03:30') !== 1322594538867 ||
        d.parse('2011-11-29') !== 1322524800000 ||
        d.parse('2011-11') !== 1320105600000 ||
        d.parse('2011') !== 1293840000000) {

        d.__parse = d.parse;

        lOff = -(new Date().getTimezoneOffset());
        lHrs = Math.floor(lOff / 60);
        lMin = lOff % 60;

        d.parse = function(v) {

            var m = regexIso8601.exec(v);

            if (m) {
                return Date.UTC(
                    m[1],
                    (m[2] || 1) - 1,
                    m[3] || 1,
                    m[4] - (m[8] ? m[9] ? m[9] + m[10] : 0 : lHrs) || 0,
                    m[5] - (m[8] ? m[9] ? m[9] + m[11] : 0 : lMin) || 0,
                    m[6] || 0,
                    ((m[7] || 0) + '00').substr(0, 3)
                );
            }

            return d.__parse.apply(this, arguments);

        };
    }

    d.__fromString = d.fromString;

    d.fromString = function(v) {

        if (!d.__fromString || regexIso8601.test(v)) {
            return new d(d.parse(v));
        }

        return d.__fromString.apply(this, arguments);
    };

})();
1 голос
/ 20 февраля 2012

Afaik 'yyyy-mm-dd hh:mm:ss' - это формат, из которого вы можете построить дату в каждом часовом поясе (используя new Date(''yyyy-mm-dd hh:mm:ss')).

например. (в Нидерландах)

new Date('1933-03-17 12:33:03'); 
   //=> Fri Mar 17 1933 12:33:03 GMT+0100 (West-Europa (standaardtijd))
new Date('1933-03-17 12:33:03').toUTCString()
   //=> Fri, 17 Mar 1933 11:33:03 GMT
0 голосов
/ 20 февраля 2012

Я не уверен, есть ли строковый формат, но использование нового Date(2012,1,20,15,10,0) должно работать. То есть Date(Years, Months, Days, Hours, Mins, Seconds), где month индексируется 0.

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