【问题标题】:ICS file dynamic timezone issue [duplicate]ICS文件动态时区问题[重复]
【发布时间】:2013-05-14 13:18:04
【问题描述】:

我正在尝试在 PHP 中动态生成 ics 文件,其中时区根据给定的位置是动态的。一切正常,但存在日光时间问题​​,即它显示一小时左右的时差。现在要解决这个问题,我必须动态使用DAYLIGHT。但我不知道如何动态使用它,或者我从哪里可以获得与给定时区相关的TZOFFSETFROMTZOFFSETTO 偏移量。

例如:

    $timeZone = "America/Denver" // dynamically fetched from DB

      $ical = "BEGIN:VCALENDAR\n";
      $ical .= "VERSION:2.0\n";
      $ical .= "PRODID:-//LokalMotion//LokalMotion Events v1.0//EN\n";
      $ical .= "CALSCALE:GREGORIAN\n";
      $ical .= "METHOD:PUBLISH\n";
      $ical .= "X-WR-CALNAME:LokalMotion Events\n";
      $ical .= "X-MS-OLK-FORCEINSPECTOROPEN:TRUE\n";
      $ical .= "BEGIN:VTIMEZONE\n";
      $ical .= "TZID:{$timeZone}\n";
      $ical .= "TZURL:http://tzurl.org/zoneinfo-outlook/{$timeZone}\n";
      $ical .= "X-LIC-LOCATION:{$timeZone}\n";
      $ical .= "END:VTIMEZONE\n";
      $ical .= "BEGIN:VEVENT\n";
      $ical .= "DTSTAMP:".date('Ymd\THis\Z')."\n";
      $ical .= "DTSTART;TZID={$timeZone}:{$start_date}\n";
      $ical .= "DTEND;TZID={$timeZone}:{$end_date}\n";
      $ical .= "STATUS:CONFIRMED\n";
      $ical .= "SUMMARY:{$title}\n";
      $ical .= "DESCRIPTION:{$description}\n";
      $ical .= "ORGANIZER;CN=Reminder:MAILTO:support@mysite.com\n";
      $ical .= "CLASS:PUBLIC\n";
      $ical .= "CREATED:{$start_date}Z\n";
      $ical .= "LOCATION:{$location}\n";
      $ical .= "URL:http://www.mysite.com\n";
      $ical .= "SEQUENCE:1\n";
      $ical .= "LAST-MODIFIED:".date('Ymd\THis\Z')."\n";
      $ical .= "UID:{$title}-support@mysite.com\n";
      $ical .= "END:VEVENT\n";
      $ical .= "END:VCALENDAR";    

echo $ical;

现在如何根据位置动态使用日光,例如位置可以是“美国/加拉加斯”......等等

$ical .= "BEGIN:DAYLIGHT";
$ical .= "TZOFFSETFROM:{}"; //I need this dynamic
$ical .= "TZOFFSETTO:{}";//I need this dynamic
$ical .= "TZNAME:EDT";
$ical .= "DTSTART;TZID={$timeZone}:{$start_date}\n";
$ical .= "RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU";
$ical .= "END:DAYLIGHT";

提前致谢。

【问题讨论】:

  • 您可以使用来自DateTimeZone::getTransitions 的信息来正确填写值。见these docs
  • 感谢马特的支持。
  • 请勿在日期时间戳的末尾使用“Z”,因为在这种情况下 Outlook 和 iCal 将使用此时间作为 UTC 并根据您当地的时区重新计算。
  • @Art:很遗憾,Google 日历似乎不支持“浮动”时间格式(即末尾没有“Z”),在这种情况下它默认为 UTC!

标签: php timezone icalendar timezone-offset


【解决方案1】:

在转换时间和日期之前,您应该在 PHP 中设置正确的时区,以便引擎知道您正在使用的时区的时间特征:

date_default_timezone_set('America/Mexico_City');
$start_date = date('c', time());   // ISO date 8601 of "right now"
$start_zone = date('O', time());   // TZOFFSETFROM format  of "right now"

date_default_timezone_set('America/Denver');
$to_zone = date('O', time());   // TZOFFSETTO of "right now"

希望对你有帮助

【讨论】:

  • 谢谢,有道理。 :)
  • 为什么这是公认的答案?它没有解决如何动态填充 TZOFFSETFROMTZOFFSETTO 值,这是原始问题的核心
  • 我认为它工作正常,因为我使用了$start_zone = date('O', time()); // TZOFFSETFROM,然后我设置了date_default_timezone_set($timeZone);,然后我为 TZOFFSETTO 设置了$end_zone = date('O', time());
  • 这不是 TZOFFSETFROMTZOFFSETTO 应该代表的。见these docs。您还需要填写DTSTART 值。
  • Matt,我想这只是一个关于如何以正确格式构建时区的示例。 Bheem 将知道从他的应用程序中的“从”和“到”时区到哪里捕获。实际上,TO 不是指结束时间,而是指 DTSTART 的目标时区,我更正了建议
猜你喜欢
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 2017-12-25
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多