javascript - 从 Google Calendar API 检索 "All Day"事件时,如何考虑时区偏移?

标签 javascript date datetime google-calendar-api

我有一个 Ajax 调用来从公共(public) 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() 会将其解释为 GMT。也就是说,即使事件已经在您本地的时区创建,也会将该特定日期更正为您本地的时区。在我的特定情况下,当检索 2014 年 4 月 7 日发生在我的时区的“全天”事件时,将返回一个字符串,就好像它是 5 小时前一样

  new Date("2014-04-07")

返回 Sun Apr 06 2014 19:00:00 GMT-0500 (CDT),晚 5 小时。 (有关日期解析的更多详细信息,请参阅以下question)

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

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

如有任何帮助,我们将不胜感激!

最佳答案

当您说带有偏移量的 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]);
}

关于javascript - 从 Google Calendar API 检索 "All Day"事件时,如何考虑时区偏移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22898830/

相关文章:

javascript - 如何根据文本添加附加属性

javascript - 输入框不允许输入

java - 检查日期解析是否正确

java - 如何在 Java 中创建一个没有年份参数的新 Date 对象?

java - 查找给定 java.util.Date 对象距当前日期的天数

c# - Oracle 根据浏览器文化返回日期时间格式

javascript - Angularjs - 使用 "this"关键字从其范围之外更新 ng-repeat 中的各个值

javascript - 函数中的 'this' 关键字

c# - 无法解析格式为 2013-09-17T05 :15:27. 947 的日期字符串

sql-server - TSQL 从 "seed"日期开始每隔一个星期五确定一次