Php ICS文件动态时区问题
我试图在PHP中动态生成ics文件,根据给定的位置,时区是动态的。一切正常,但有白天的问题,即它显示的时差约一小时。现在要解决这个问题,我必须动态地使用Php ICS文件动态时区问题,php,timezone,icalendar,timezone-offset,Php,Timezone,Icalendar,Timezone Offset,我试图在PHP中动态生成ics文件,根据给定的位置,时区是动态的。一切正常,但有白天的问题,即它显示的时差约一小时。现在要解决这个问题,我必须动态地使用DAYLIGHT。但是我不知道如何动态地使用它,或者从哪里可以获得与给定时区相关的TZOFFSETFROM和tzoffetto偏移量 例如: $timeZone = "America/Denver" // dynamically fetched from DB $ical = "BEGIN:VCALENDAR\n";
DAYLIGHT
。但是我不知道如何动态地使用它,或者从哪里可以获得与给定时区相关的TZOFFSETFROM
和tzoffetto
偏移量
例如:
$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";
提前感谢。在转换时间和日期之前,您应该在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"
希望这能有所帮助谢谢,这很有意义。:)为什么这是公认的答案?它没有说明如何动态填充
tzoffetfrom
和tzoffeto
值,这是原始问题的核心。我认为它工作正常,因为我使用了$start\u zone=date('O',time());//TZOFFSETFROM
然后我设置日期\默认\时区\设置($timezone)代码>并进一步设置$end_zone=date('O',time())
用于TZOFFETTOTHOTH这不是TZOFFETTFROM
和TZOFFETTO
应该代表的内容。看见您还需要填写DTSTART
值。Matt,我想这只是一个如何使用正确格式构建时区的示例。Bheem将知道从他的应用程序中捕捉“从”和“到”时区的位置。实际上,TO不是指结束时间,而是指DTSTART的目标时区。我更正了提议。您可以使用DateTimeZone::getTransitions
中的信息正确填充值。请参阅。感谢Matt的支持。不要在日期时间戳末尾使用“Z”,因为在这种情况下,Outlook和iCal将使用此时间作为UTC,并根据您的本地时区重新计算。@Art:不幸的是,Google日历似乎不支持“浮动”时间格式(即末尾没有“Z”),在这种情况下,它默认为UTC!