2

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

问题似乎与插件解析功能有关。有人可以为我提供将包含“Z”恶魔化的UTC字符串解析为本地日期时间以供显示的功能吗?

4

3 回答 3

1

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

于 2010-03-22T09:15:01.483 回答
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;
}
于 2010-03-22T09:18:18.627 回答
1

在您可能错过了一些最初的困惑(我和安迪 E 的回答,主要是我对他的回答的评论)之后,我发现了似乎是您问题的真正原因。

该插件在内部使用与parseISO8601Andy E 提出的功能相同的代码,该代码来自Parsing W3C's ISO 8601 Date/Times in JavaScript

但是,尽管 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()在这个插件中,总是在ignoreTimezone设置为 true 的情况下调用。

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

于 2010-03-22T09:20:13.637 回答