我正在开发一个可以离线使用的JavaScript网站,目标是移动设备。其中一种移动设备是iPhone。
我正在尝试解析来自我们REST API的日期(JSON对象的成员)。我正在使用
Date.parse("2010-03-15 10:30:00");
这段代码在安卓设备上能够正常工作,但是在iPhone设备上却提示日期无效。
我应该如何格式化我的日期字符串才能被iPhone正确解析?
我正在开发一个可以离线使用的JavaScript网站,目标是移动设备。其中一种移动设备是iPhone。
我正在尝试解析来自我们REST API的日期(JSON对象的成员)。我正在使用
Date.parse("2010-03-15 10:30:00");
这段代码在安卓设备上能够正常工作,但是在iPhone设备上却提示日期无效。
我应该如何格式化我的日期字符串才能被iPhone正确解析?
并非所有的浏览器都支持相同的日期格式。最好的方法是基于分隔符字符(-
,
,和:
)对字符串进行拆分,然后将每个数组项传递给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)
这在所有浏览器中都可以正常工作。
T
加入你的正则表达式以支持 ISO 8601。 - Tomas/[- :]/
至 /[- :\/]/
。 - bhagyas对于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]);
-
,而在字符类的任何位置都不需要转义+
。同样适用于:/[-+ :T]/
。 - Samconst arr = isoFormattedString.split(/[\-\+ :TZ]/);
- Elijah MockDate.parse("2010-03-15T10:30:00");
// e.g.
var d = new Date( Date.parse("2010-03-15T10:30:00") );
console.log( d.toString() ); //Mon Mar 15 2010 10:30:00 GMT+0000 (BST)
更新于2019-07-29: 不删除下面的现有内容,但我强烈建议您不要使用这种方法。我从错误中吸取了教训。不要覆盖JavaScript的现有方法。这会影响您代码的可移植性和性能。如果您无法获取ISO 8601(这是JS和大多数API的标准实践)-那么请更改该系统。或者,编写自己的函数,必须始终调用以生成Date
对象。
/**
* 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));
代码中有一个错误
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]);
解决方案。如果Date()是月底,而且所设置的月份天数比实际少,则结果会相差一个月。
Date.parse(String("2010-03-15 10:30:00"));
如果仍然遇到问题,请使用Moment.js。
很高兴能帮忙。:-)