gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 18:30:03 27 4
gpt4 key购买 nike

是否存在可以在所有浏览器和地区/时区中工作的日期对象的字符串格式(即 new Date('date string'))?

我们尝试使用格式 suggested in the HTML5 spec yyyy-mm-ddThh:mm:ss+hh:mm,但遇到了 Safari 和 IE 的问题。我们已经尝试使用不太正式的格式 mm/dd/yyyy hh:ss:mm ,但据我所知,如果您的语言环境,“月前”格式可能会模棱两可设置假定第一个数字是一天(非美国国家/地区)。此外,它不附加时区,不同时区会出现问题。

最佳答案

简而言之,这几乎是不可能做出的 promise ,因为实现依赖于 UA。我建议使用 iso8601 格式,因为它将成为 future 的标准格式,并使用垫片来帮助进行日期解析,这是我为自己使用而编写的格式:

(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

希望这对你有帮助-ck

更新:(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、opera 和 mobile safari 遵循 ES5.1,而 IE10、firefox 和 desktop safari 似乎遵循 ES6。所以现在这是一个 split 的决定......因此需要这个脚本的第二个 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);
};

})();

关于javascript - 是否有适用于所有浏览器和所有地区的 Date 字符串格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9363270/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com