我从 Web 服务收到一个带有以下格式日期的字符串:
yyyy-MM-ddTHH:mm:ss.fffZ
我需要使用 JavaScript 将该字符串转换为正常的 DateTime 但不使用新的Date('yyyy-MM-ddTHH:mm:ss.fffZ')
,因为我使用的是不支持该转换的旧版本的 JavaScript。我可以拆分该字符串并获得:
- 年
- 月
- 天
- 时间
但是如何操纵时区有"fffZ"
什么建议吗?
我从 Web 服务收到一个带有以下格式日期的字符串:
yyyy-MM-ddTHH:mm:ss.fffZ
我需要使用 JavaScript 将该字符串转换为正常的 DateTime 但不使用新的Date('yyyy-MM-ddTHH:mm:ss.fffZ')
,因为我使用的是不支持该转换的旧版本的 JavaScript。我可以拆分该字符串并获得:
但是如何操纵时区有"fffZ"
什么建议吗?
这是来自John Resig的一个班轮:
var date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ")),
我已经建立了解决方案。请检查http://webcloud.se/log/JavaScript-and-ISO-8601/
Date.prototype.setISO8601 = function (string) {
var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
"(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
"(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
var d = string.match(new RegExp(regexp));
var offset = 0;
var date = new Date(d[1], 0, 1);
if (d[3]) { date.setMonth(d[3] - 1); }
if (d[5]) { date.setDate(d[5]); }
if (d[7]) { date.setHours(d[7]); }
if (d[8]) { date.setMinutes(d[8]); }
if (d[10]) { date.setSeconds(d[10]); }
if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
if (d[14]) {
offset = (Number(d[16]) * 60) + Number(d[17]);
offset *= ((d[15] == '-') ? 1 : -1);
}
offset -= date.getTimezoneOffset();
time = (Number(date) + (offset * 60 * 1000));
this.setTime(Number(time));
}
如果您知道它将采用这种形式(ISO 8601,wiki),您可以使用 RegExp 或字符串方法进行解析。Z
这是一个 RegExp 示例,可让您使用 timezone+hh
或+hh:mm
.
var dateString = '2013-01-08T17:16:36.000Z';
var ISO_8601_re = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{3}))?(Z|[\+-]\d{2}(?::\d{2})?)$/,
m = dateString .match(ISO_8601_re);
var year = +m[1],
month = +m[2],
dayOfMonth = +m[3],
hour = +m[4],
minute = +m[5],
second = +m[6],
ms = +m[7], // +'' === 0
timezone = m[8];
if (timezone === 'Z') timezone = 0;
else timezone = timezone.split(':'), timezone = +(timezone[0][0]+'1') * (60*(+timezone[0].slice(1)) + (+timezone[1] || 0));
// timezone is now minutes
// your prefered way to construct
var myDate = new Date();
myDate.setUTCFullYear(year);
myDate.setUTCMonth(month - 1);
myDate.setUTCDate(dayOfMonth);
myDate.setUTCHours(hour);
myDate.setUTCMinutes(minute + timezone); // timezone offset set here, after hours
myDate.setUTCSeconds(second);
myDate.setUTCMilliseconds(ms);
console.log(myDate); // Tue Jan 08 2013 17:16:36 GMT+0000 (GMT Standard Time)
momentjs可以解决这个问题以及您可能遇到的许多其他日期问题。虽然不清楚您将在何处以及如何使用所需的日期,也不是所需的格式,但我认为 momentjs 可以为您提供一些所需的任务,我会将模块添加到我的解决方案中并用作(下面是 parse.com 云代码):
Parse.Cloud.define("momentFormat", function(request, response){
var message;
var date = momento('2013-01-08T17:16:36.000Z');
response.success("original format date: " + date.format("YYYY-MM-DDTHH:mm:ss.SSSZ") + " new format date: " + date.format("dddd, MMMM Do YYYY, h:mm:ss a"));
});
输出:
{"result":"original format date: 2013-01-08T17:16:36.000+00:00 new format date: Tuesday, January 8th 2013, 5:16:36 pm"}