代码之家  ›  专栏  ›  技术社区  ›  Brian Scott

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

  •  2
  • Brian Scott  · 技术社区  · 14 年前

    我正在使用 jQuery fullcalendar plugin 但是我遇到了一个关于英国夏令时的问题。夏令时生效后,显示的时间与实际时间相差一小时。

    问题似乎出在插件解析函数上。有人能给我提供一个函数来解析一个包含'z'演示的UTC字符串到一个本地日期时间来显示吗?

    3 回复  |  直到 14 年前
        1
  •  1
  •   jitter    14 年前

    在最初的困惑(我和安迪E的回答,主要是我对他的回答的评论)之后,我发现了你问题的真正原因。

    插件在内部使用 parseISO8601 Andy E提出的函数 Parsing W3C's ISO 8601 Date/Times in JavaScript .

    但是,尽管andy e声明代码可以正常工作,但是使用该代码的fullcalendar插件似乎有一个bug。

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

    比较这些代码段

    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() 在这个插件中总是用 忽略时区 设置为真。

    因此,我敢打赌这个bug来自于此,你应该考虑联系插件的作者。但首先,如果设置了 忽略时区 在插件代码中为false

        2
  •  1
  •   Philippe Leybaert    14 年前

    这可能对你有用:

    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;
    }
    
        3
  •  1
  •   Andy E    14 年前

    我想你是说一个iso 8601日期字符串( UTC 是时间标准,而不是显示格式)。我已经用过 this function 从delete.me.uk到现在已经有几年了,在一个没有问题的生产环境中,在bst/gmt(我的本地时区)中测试它。