【问题标题】:How do you account for time-zone offset when retriving an "All Day" event from Google Calendar API?从 Google Calendar API 检索“全天”事件时,您如何考虑时区偏移?
【发布时间】:2014-04-06 19:24:56
【问题描述】:

我有一个 Ajax 调用来从公共 Google 日历中检索信息:

$.ajax({
      url: "https://www.google.com/calendar/feeds/{CalID}/public/full?start-min={StartTime}&start-max={endTime}&alt=json-in-script&callback=?";
      dataType: 'json',
      timeout: 3000,
      success: function( data ) { ProcessData(data);},
});

在函数ProcessData(data)内我有以下语句:

StartTime = new Date(data.feed.entry[i].gd$when[j].startTime);

StartTime 中存储一个Date() 对象,其中包含特定事件的开始日期。 Google 通常使用 ISO 8601 时间格式:YYYY-MM-DDThh:mmTZD(例如 1997-07-16T19:20+01:00),这很好用。但是,对于“全天”事件,格式仅采用以下形式:YYYY-MM-DD(例如 1997-07-16)(W3 http://www.w3.org/TR/NOTE-datetime 允许),在这种情况下 new Date() 会将其解释为格林威治标准时间。也就是说,即使事件已经在您当地的时区创建,也会将该特定日期更正为您当地的时区。在我的特殊情况下,当检索一个“全天”事件时,比如说,2014 年 4 月 7 日发生在我的时区,会返回一个字符串,就好像它早于 5 小时一样

  new Date("2014-04-07")

返回 2014 年 4 月 6 日星期日 19:00:00 GMT-0500 (CDT),关闭 5 小时。 (有关日期解析的更多详细信息,请参阅以下question

您在使用 Google 日历时是否曾遇到过这个问题?如果是这样,你是如何解决的?我应该使用不同的方法而不是实际考虑时区的 new Date() 吗?

Google 的 JSON 响应包含一个参数 feed.timezone,其中包含 Olson 的时区 ID,但我需要一种方法将(希望是另一个 Ajax 调用或类似的)该 ID 转换为实际偏移量。我在这个论坛中找到了以下question,但问题在于这个 API 需要的参数是实际城市而不是时区 ID,这让我以某种方式将时区 ID 转换为要传递到的城市URL 字符串。

任何帮助将不胜感激!

【问题讨论】:

    标签: javascript date datetime google-calendar-api


    【解决方案1】:

    当您说带有偏移量的 ISO 8601 字符串“工作正常”时,您是将解析留给 Date 构造函数,还是您自己做?一些浏览器不会正确解析 ISO 字符串,更多浏览器不会正确解析带有偏移量的字符串。有一个答案 here 显示了如何为所有浏览器解析带有偏移量的 ISO 字符串。

    关于如何处理日期,这是一个只有业务逻辑答案的问题。如果它被解释为 ISO 8601 字符串,那么在格林威治以西的任何时区(或在夏令时以西超过一小时),它将导致一天前的日期。如果您希望将其视为本地日期,则需要先测试字符串以查看它是否只是日期,如果是,则将其视为本地日期,例如

    if (/^\d{4}-\d{2}-\d{2}/.test(dateString) {
      // treat as date
    } else {
      // treat as date and time
    }
    

    将字符串解析为本地日期非常简单:

    // Expect a date string in ISO 8601 format YYYY-MM-DD
    // Date is created as a local date
    function parseLocalDateTime(s) {
      s = s.split(/\D+/g);
      return new Date(s[0], --s[1], s[2]);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-18
      • 2021-12-26
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 2011-06-02
      • 2010-11-06
      相关资源
      最近更新 更多