Php ical格式的会议请求

Php ical格式的会议请求,php,icalendar,Php,Icalendar,我有一张安排会议的表格。现在我需要添加时区 我有两个下拉列表,一个是时区,一个是时间。所以,如果我选择时区为萨摩亚中途岛(GMT-11:00),时间为下午4:00,邮件将发送给outlook中有会议请求的人现在他的outlook配置了IST,但由于选择的时区是新时区,因此应适当调整。 $ical = 'BEGIN:VCALENDAR PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN VERSION:2.0 METHOD:R

我有一张安排会议的表格。现在我需要添加时区

我有两个下拉列表,一个是时区,一个是时间。所以,如果我选择时区为萨摩亚中途岛(GMT-11:00),时间为下午4:00,邮件将发送给outlook中有会议请求的人

现在他的outlook配置了IST,但由于选择的时区是新时区,因此应适当调整。

$ical =    'BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
VERSION:2.0
METHOD:REQUEST
BEGIN:VEVENT
ORGANIZER:MAILTO:'.$from_address.'
ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;
 CN='.$to.':mailto:'.$to.'
DTSTART:'.$dtstart.'
DTEND:'.$dtend.'
LOCATION:'.$meeting_location.'
TRANSP:OPAQUE
SEQUENCE:0
UID:'.$cal_uid.'
DTSTAMP:'.$todaystamp.'
DESCRIPTION:'.$meeting_description.'
SUMMARY:'.$subject.'
PRIORITY:5
CLASS:PUBLIC
END:VEVENT
END:VCALENDAR';
我已经查过了。。它说我必须加上VTIMEZONE,TZID,tzoffetfrom,tzoffetto
现在我不明白Tzoffetto的意思了,Tzoffetto。。。?如何使用这些来执行任务呢?

VTIMEZONE的内容是,如果你想定义/重新定义时区,当夏时制改变时,等等

出于您的目的,您不需要这样做,只需将时区添加到DTSTART的时间值中即可:

例如:DTSTART;TZID=欧洲/伦敦:20060707T130000

或者,如果您想要整个ics文件的时区,您可以发布一个普遍接受的

X-WR-时区:欧洲/奥斯陆

(在文件头的日历级别,而不是在VEVENT中)

一些可能有帮助的注意事项:


请注意,无论您选择什么
TZID
(它们是自由格式),它们都应该在配置的
VTIMEZONE
部分中有一个匹配的条目。与@anmari所说的相反,
VTIMEZONE
部分是Outlook等识别日历事件所必需的(显示接受/拒绝按钮)

根据我的经验,最明智的方法是采用(从邮件源复制/粘贴)现有的
VTIMEZONE
配置。这是西欧的一个例子:

BEGIN:VTIMEZONE
TZID:W. Europe Standard Time
BEGIN:STANDARD
DTSTART:16010101T030000
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:16010101T020000
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3
END:DAYLIGHT
END:VTIMEZONE
不要更改任何内容-只需将其复制/粘贴到您的电子邮件代码中即可。现在,我们在内部使用一个与此时区匹配的PHP时区,例如“Europe/Amsterdam”。我们使用它作为基本时区,并使用PHP类将
VEVENT
的值转换为它

发送此信息时,接收日历/电子邮件的客户端将自动将传入的时间数据转换为收件人的时区。耶!:)

当我把它添加到“DTSTART;TZID=Europe/London:20060707T130000”中时,它现在可以工作了。我还在DTEND中添加了tzid。现在邮件不再以会议形式发送。
$Date = new DateTime( $event_date ); // this will be in the server's time zone

// convert it to the 'internal' time zone
$Date->setTimezone( new DateTimeZone( 'Europe/Amsterdam' ) );

// ...

echo "BEGIN:VEVENT\n";
echo "DTSTART;TZID=W. Europe Standard Time:" . $Date->format( 'Ymd\THis' ) . "\n"