是否有日期的字符串格式可以构建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};前一个月"如果您的区域设置假设第一个数字是一天(非美国国家/地区),则格式设置可能不明确。此外,它没有附加时区,这会对不同的时区产生问题。
答案 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
希望这有助于确认
更新:(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)
Koviko,
我认为有人问了同样的问题 -
JavaScript: Which browsers support parsing of ISO-8601 Date String with Date.parse
答案 3 :(得分:0)
我不确定是否存在字符串格式,但使用新的Date(2012,1,20,15,10,0)
应该有效。也就是说,Date(Years, Months, Days, Hours, Mins, Seconds)
,month
被0
编入索引。