我目前正在使用jQuery fullcalendar 插件,但我遇到了一个关于英国夏令时的问题。夏令时生效后,小时将显示一个小时异相。
问题似乎与插件解析功能有关。有人可以为我提供将包含“Z”恶魔化的UTC字符串解析为本地日期时间以供显示的功能吗?
我目前正在使用jQuery fullcalendar 插件,但我遇到了一个关于英国夏令时的问题。夏令时生效后,小时将显示一个小时异相。
问题似乎与插件解析功能有关。有人可以为我提供将包含“Z”恶魔化的UTC字符串解析为本地日期时间以供显示的功能吗?
这可能对你有用:
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;
}
在您可能错过了一些最初的困惑(我和安迪 E 的回答,主要是我对他的回答的评论)之后,我发现了似乎是您问题的真正原因。
该插件在内部使用与parseISO8601
Andy 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,您应该验证日期是否正确解析