如何将UTC日期格式字符串解析为本地日期时间?

时间:2010-03-22 09:09:15

标签: javascript jquery datetime utc fullcalendar

我目前正在使用jQuery fullcalendar plugin,但我遇到了一个关于英国夏令时的问题。在夏令时生效后,小时数显示为一小时异相。

问题似乎与插件解析功能有关。有人可以请我提供功能来解析一个UTC字符串,其中包含“Z”标记到本地日期时间以便显示吗?

3 个答案:

答案 0 :(得分:1)

我假设您的意思是ISO 8601日期字符串(UTC是时间标准,而不是显示格式)。我已经使用了delete.me.uk中的this function几年了,在生产环境中使用BST / GMT(我的本地时区)测试它没有问题。

答案 1 :(得分:1)

这可能对您有用:

function parseDate(value) {
    var a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);

    if (a) {
        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));
    }

    return null;
}

答案 2 :(得分:1)

经过一些初步的困惑(我和Andy E的答案,主要是我对他的回答的评论),你可能错过了,我发现了你的问题的真正原因。

该插件内部使用了来自Parsing W3C's ISO 8601 Date/Times in JavaScript的Andy E提出的parseISO8601函数的相同代码。

但是虽然Andy E表示该代码没有问题,但使用该代码的fullcalendar插件似乎也有错误。

仔细查看代码之后,我注意到该插件似乎忽略了您所在的时区。

比较这些代码段

来自delete.me.uk原始代码的片段

if (d[14]) {
    offset = (Number(d[16]) * 60) + Number(d[17]);
    offset *= ((d[15] == '-') ? 1 : -1);
}

来自fullcalendar.js的代码

if (!ignoreTimezone) {
    if (m[14]) {
        offset = Number(m[16]) * 60 + Number(m[17]);
        offset *= m[15] == '-' ? 1 : -1;
    }
    offset -= date.getTimezoneOffset();
}

如您所见,如果ignoreTimezone设置为false,则插件仅处理时区。但事实并非如此。始终会在parseISO8601()设置为true的情况下调用此插件中的ignoreTimezone

因此我打赌这个bug来自于此,您应该考虑联系该插件的作者。但首先,如果在插件代码中将ignoreTimezone设置为false,则应验证日期是否正确解析

相关问题