手动将yyyy MM ddTHH:MM:ss.fffZ转换为JavaScript中的日期时间

手动将yyyy MM ddTHH:MM:ss.fffZ转换为JavaScript中的日期时间,javascript,datetime,string-formatting,nsdateformatter,Javascript,Datetime,String Formatting,Nsdateformatter,我从Web服务收到一个带有日期的字符串,格式如下: yyyy-MM-ddTHH:mm:ss.fffZ 我需要使用JavaScript将该字符串转换为正常日期时间,但不使用新的日期('yyyy-MM-ddTHH:MM:ss.fffZ'),因为我使用的是不支持该转换的旧版本JavaScript。我可以拆分该字符串并获得: 年 月 日子 时间 但是如何操作时区“fffZ”有什么建议吗?如果您知道它将是这种形式(,),您可以使用RegExp或string方法进行解析。下面是一个RegExp示例,它

我从Web服务收到一个带有日期的字符串,格式如下:

yyyy-MM-ddTHH:mm:ss.fffZ
我需要使用JavaScript将该字符串转换为正常日期时间,但不使用新的
日期('yyyy-MM-ddTHH:MM:ss.fffZ')
,因为我使用的是不支持该转换的旧版本JavaScript。我可以拆分该字符串并获得:

  • 日子
  • 时间

但是如何操作时区
“fffZ”
有什么建议吗?

如果您知道它将是这种形式(,),您可以使用RegExp或string方法进行解析。下面是一个RegExp示例,它允许您使用时区
Z
+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可以为您提供一些所需的任务 我会将模块添加到我的解决方案中,并使用as(以下是parse.com云代码):

输出:

{"result":"original format date: 2013-01-08T17:16:36.000+00:00 new format date: Tuesday, January 8th 2013, 5:16:36 pm"}

你的javascript环境是什么?
fffZ
不是时区-时区是
Z
(,意思是UTC),而
fff
是属于秒部分的三个小数(
ss.fff
)-如果你把这三个加在一起,它们构成毫秒部分。Android 2.3(使用PhoneGap和ChildBrowser)这是我真正的字符串2013-01-08T17:16:36.000Z
新日期(“1987/02/28 23:11:81.333”)
给了我
无效日期
我认为这个答案需要解释,因为它需要一个示例,并且以一个comma@kennebec我没有错过,我只是没能复制正确的东西对吧。。。。我回答得太快了。当然,momentjs可以帮你很多。。但是yyyy-MM-ddTHH:MM:ss.fffZ没有完全重新确认。与fff部分有关的内容。。。。但我的主要观点是,使用momentjs可以克服许多问题。您如何使用它<代码>日期。setISO8601('2010-01-02T00:00:01')这样吗?
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));
}
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"}