是否有适用于所有浏览器和所有地区的日期字符串格式?

时间:2012-02-20 15:05:46

标签: javascript date

是否有日期的字符串格式可以构建Date对象(即new Date('date string')),该格式适用于所有浏览器和地区/时区?

我们尝试使用yyyy-mm-ddThh:mm:ss+hh:mm格式suggested in the HTML5 spec,但遇到了Safari和IE的问题。我们尝试使用mm/dd/yyyy hh:ss:mm的不太正式的格式,但据我所知,这可以使用{&#34};前一个月"如果您的区域设置假设第一个数字是一天(非美国国家/地区),则格式设置可能不明确。此外,它没有附加时区,这会对不同的时区产生问题。

4 个答案:

答案 0 :(得分:3)

简而言之,这是一个几乎不可能做出的承诺,因为实现依赖于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(....),每个人都会在OZ的土地上开心!

适用于所有主流浏览器,使用这些引用:

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

http://www.ecma-international.org/ecma-262/5.1/#sec-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

希望这有助于确认

更新:(2013年1月21日)

应该注意的是,被认为是“符合标准的行为”的行为将从ECMAScript-262 v5.1变为ECMAScript-262 v6.0。请参阅:http://people.mozilla.org/~jorendorff/es6-draft.html#sec-15.9.1.15

语言来自:缺席时区偏移的值是“Z”。 如果没有时区偏移,则日期 - 时间被解释为当地时间。

现在的泡菜是:Chrome,歌剧和移动游猎跟随ES5.1,而IE10,firefox和桌面游猎似乎跟随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 :(得分:1)

Afaik'yyyy-mm-dd hh:mm:ss'是一种格式,您可以在该格式中为每个时区创建日期(使用new Date(''yyyy-mm-dd hh:mm:ss'))。

e.g。 (在荷兰)

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

答案 2 :(得分:0)

答案 3 :(得分:0)

我不确定是否存在字符串格式,但使用新的Date(2012,1,20,15,10,0)应该有效。也就是说,Date(Years, Months, Days, Hours, Mins, Seconds)month0编入索引。