Iphone 上的 Javascript 日期解析
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5324178/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Javascript date parsing on Iphone
提问by Morten
I'm working on an offline capabable Javascript site that targets mobile devices. One such mobile device is the IPhone.
我正在开发一个针对移动设备的可离线使用的 Javascript 站点。一种这样的移动设备是IPhone。
I'm trying to parse a date from our REST API (a member of JSON object). I'm using
我正在尝试从我们的 REST API(JSON 对象的成员)解析日期。我正在使用
Date.parse("2010-03-15 10:30:00");
This works on Android devices, however on IPhone it just gives an invalid date.
这适用于 Android 设备,但在 iPhone 上它只给出一个无效的日期。
How do I need to format my date string so it can be parsed by the IPhone?
我需要如何格式化我的日期字符串以便它可以被 iPhone 解析?
回答by Andy E
Not all browsers support the same date formats. The best approach is to split the string on the separator characters (-
,
and :
) instead, and pass each of the resulting array items to the Date
constructor:
并非所有浏览器都支持相同的日期格式。最好的方法是在分隔符(-
,
和:
)上拆分字符串,并将每个结果数组项传递给Date
构造函数:
var arr = "2010-03-15 10:30:00".split(/[- :]/),
date = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
console.log(date);
//-> Mon Mar 15 2010 10:30:00 GMT+0000 (GMT Standard Time)
This will work the same in all browsers.
这在所有浏览器中都是一样的。
回答by Henry
For UTC/GMT time, you can try:
对于 UTC/GMT 时间,您可以尝试:
var arr = "2014-10-27T16:05:44+0000".split(/[\-\+ :T]/);
var date = new Date();
date.setUTCFullYear(arr[0]);
date.setUTCMonth(arr[1] - 1);
date.setUTCDate(arr[2]);
date.setUTCHours(arr[3]);
date.setUTCMinutes(arr[4]);
date.setUTCSeconds(arr[5]);
The date object will display in the proper local timezone when used.
使用时,日期对象将显示在正确的本地时区中。
回答by meouw
回答by MikeMurko
Update 2019-07-29:Not removing existing content below, but I highly suggest you don't use this method. I learned from my mistakes. Do not override JavaScript's existing methods. Becomes bad for your code's portability and performance. If you can't get ISO 8601 (which is standard practice in JS and most API's) - then change that system instead. Alternatively, write your own function, which always has to be called to generate a Date
object.
2019 年 7 月 29 日更新:不会删除下面的现有内容,但我强烈建议您不要使用此方法。我从错误中吸取了教训。不要覆盖 JavaScript 的现有方法。对代码的可移植性和性能不利。如果您无法获得 ISO 8601(这是 JS 和大多数 API 中的标准做法),那么请改为更改该系统。或者,编写您自己的函数,该函数必须始终被调用以生成Date
对象。
If you can correct your REST API to send down proper ISO 8601 date times, the proper way to handle this is to use a regex shim that allows all browsers to process ISO 8601 dates. Sure it might be slower, but handling dates with Javascript is like trying to get a cat into a tub of water.
如果您可以更正 REST API 以发送正确的 ISO 8601 日期时间,则处理此问题的正确方法是使用正则表达式垫片,允许所有浏览器处理 ISO 8601 日期。当然它可能会更慢,但是用 Javascript 处理日期就像试图把一只猫放进一桶水里。
Keep in mind the following method overrides the original Date.parse method. This could be problematic in larger projects or with many developers with different expectations. Use only if you're aware of what you're doing.
请记住,以下方法会覆盖原始 Date.parse 方法。这在较大的项目中或对于许多具有不同期望的开发人员来说可能是有问题的。仅当您知道自己在做什么时才使用。
/**
* Date.parse with progressive enhancement for ISO 8601 <https://github.com/csnover/js-iso8601>
* ? 2011 Colin Snover <http://zetafleet.com>
* Released under MIT license.
*/
(function (Date, undefined) {
var origParse = Date.parse, numericKeys = [ 1, 4, 5, 6, 7, 10, 11 ];
Date.parse = function (date) {
var timestamp, struct, minutesOffset = 0;
// ES5 §15.9.4.2 states that the string should attempt to be parsed as a Date Time String Format string
// before falling back to any implementation-specific date parsing, so that's what we do, even if native
// implementations could be faster
// 1 YYYY 2 MM 3 DD 4 HH 5 mm 6 ss 7 msec 8 Z 9 ± 10 tzHH 11 tzmm
if ((struct = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(date))) {
// avoid NaN timestamps caused by “undefined” values being passed to Date.UTC
for (var i = 0, k; (k = numericKeys[i]); ++i) {
struct[k] = +struct[k] || 0;
}
// allow undefined days and months
struct[2] = (+struct[2] || 1) - 1;
struct[3] = +struct[3] || 1;
if (struct[8] !== 'Z' && struct[9] !== undefined) {
minutesOffset = struct[10] * 60 + struct[11];
if (struct[9] === '+') {
minutesOffset = 0 - minutesOffset;
}
}
timestamp = Date.UTC(struct[1], struct[2], struct[3], struct[4], struct[5] + minutesOffset, struct[6], struct[7]);
}
else {
timestamp = origParse ? origParse(date) : NaN;
}
return timestamp;
};
}(Date));