Google 日历 API 问题 - 夏令时

Posted

技术标签:

【中文标题】Google 日历 API 问题 - 夏令时【英文标题】:Google calendar API issue - daylight saving 【发布时间】:2018-08-27 22:27:49 【问题描述】:

我使用 Google 日历 API 创建了一个应用程序来评估事件,最后还将事件添加到日历中。现在我们接近切换到夏令时我遇到了问题:API 正在将时间转换一小时。 示例:

$event = new Google_Service_Calendar_Event(array(
   'summary' => 'title',
   'description' => 'description',
   'start' => array(
       'dateTime' => '2018-04-05T12:00:00+1:00',
       'timeZone' => 'Europe/Amsterdam',
   ),
   'end' => array(
       'dateTime' => '2018-04-05T15:00:00+1:00',
       'timeZone' => 'Europe/Amsterdam',
   )
));

$event = $cal->events->insert($room_calendar_id, $event);

当我执行此代码时,结果是一个从 13:00 到 16:00 运行的事件。当我通过 Google 日历 API 试用功能使用这些参数时,它会给出相同的结果。但在后一种情况下,它会返回以下 JSON 响应:

"start": 
  "dateTime": "2018-04-20T13:00:00+02:00",
  "timeZone": "Europe/Amsterdam"
 ,
"end": 
  "dateTime": "2018-04-20T16:00:00+02:00",
  "timeZone": "Europe/Amsterdam"
  

太奇怪了,它显示了 +02:00 的偏移量。 我希望 API 不会更改时间和偏移参数。

当我为 2018-03-20 做同样的事情时,它工作正常,所以我认为夏令时应该会导致这个问题。

有人可以提供更多关于我应该如何在不考虑夏令时影响的情况下添加事件的信息吗?

【问题讨论】:

【参考方案1】:

时区 - 例如Europe/Amsterdam - 具有夏令时效果,您无法避免它们,因为 DST 是由时区定义控制的事物的一部分。

在夏令时期间,offset used in Amsterdam is changed from +01:00 to +02:00。所以这并不奇怪,这实际上是预期的行为。

Google API 正在做的事情 - 可能 - 正在将无效偏移量 (2018-04-05T12:00:00+01:00) 调整为有效偏移量 (2018-04-05T13:00:00+02:00) - 顺便说一句,两者都对应于相同的 UTC 时刻,因此转换很好。

这不会发生在 3 月 20 日,因为 DST 尚未开始 - 2018 年,它从 3 月 25 日开始。

如果您正在处理时区,则无法忽略 DST 影响,因为DST is part of the timezone definition。

【讨论】:

我真正做错的事情是偏移量和时区的组合。当我去掉偏移后,结果还可以!!

以上是关于Google 日历 API 问题 - 夏令时的主要内容,如果未能解决你的问题,请参考以下文章

mktime夏令时处理

无需夏令时调整即可快速创建 EKEvent

java日历的DST问题

PHP 处理夏令时的时区

Java API 获得一年的夏令时边界

Java 为啥 Calendar.get(Calendar.DST_OFFSET) 在夏令时给出 0?