Javascript 从谷歌日历API中检索“全天”事件时,如何计算时区偏移?

Javascript 从谷歌日历API中检索“全天”事件时,如何计算时区偏移?,javascript,date,datetime,google-calendar-api,Javascript,Date,Datetime,Google Calendar Api,我有一个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, succ

我有一个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);},
});
在函数ProcessDatadata中,我有以下语句:

StartTime = new Date(data.feed.entry[i].gd$when[j].startTime);
它在StartTime中存储一个日期对象,该对象具有特定事件开始的日期。谷歌通常使用ISO8601时间格式:YYYY-MM-DDThh:mmTZD-eg 1997-07-16T19:20+01:00,这种格式很好用。但是,对于全天活动,格式仅为W3允许的格式:YYYY-MM-DD eg 1997-07-16,在这种情况下,新日期将解释为GMT。这将根据您的本地时区更正特定日期,即使事件已在您的本地时区中创建。在我的特殊情况下,当检索2014年4月7日发生在我所在时区的全天事件时,将返回一个字符串,就好像它是5小时前发生的一样

  new Date("2014-04-07")
返回2014年4月6日星期日19:00:00 GMT-0500 CDT,其关闭时间为5小时。有关日期解析的更多详细信息,请参见以下内容

在使用谷歌日历时,您是否曾经处理过这个问题?如果是,你是如何解决的?我是否应该使用另一种方法,而不是使用新的日期来解释时区

Google的JSON响应包含一个参数feed.timezone,其中包含Olson的时区ID,但我需要一种方法将另一个Ajax调用或类似的ID转换为实际偏移量。我在这个论坛上发现了以下内容,但问题是,这个API需要的参数是实际的城市,而不是时区ID,这使得我能够以某种方式将时区ID转换为城市,并传递到URL字符串


任何帮助都将不胜感激

当你说带偏移量的ISO8601字符串工作得很好时,你是在让解析保持最新的构造函数,还是你自己在做?一些浏览器无法正确解析ISO字符串,更多浏览器无法正确解析带有偏移量的字符串。有一个答案显示了如何为所有浏览器解析带有偏移量的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]);
}