Невозможно получить vCalendar (vcs) для корректировки времени при открытии в другом часовом поясе

Я создаю файл .vcs, используя библиотеку PHP iCalcreator (v2.6). Когда событие открывается в Outlook (последняя версия, я не знаю о других версиях), дата / время встречи не корректируется по местному времени. Я думал, что это может быть связано с этот, но установка значения X-MICROSOFT-CDO-TZID, похоже, не помогла. Я надеюсь, что кто-то знает что-то о создании файла VCS, кто может указать мне в правильном направлении. Вот файл VCS, который я создаю:

BEGIN:VCALENDAR
CALSCALE:GREGORIAN
METHOD:PUBLISH
PRODID:-//127.0.53.53//NONSGML iCalcreator 2.6//
VERSION:2.0
BEGIN:VTIMEZONE
TZID:US/Pacific
LAST-MODIFIED:20040110T032845Z
X-MICROSOFT-CDO-TZID:13
BEGIN:DAYLIGHT
DTSTART:19900404T010000
TZOFFSETFROM:-0800
TZOFFSETTO:-0700
RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
TZNAME:PDT
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:19901026T060000
TZOFFSETFROM:-0700
TZOFFSETTO:-0800
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
TZNAME:PST
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
UID:[email protected]
DTSTAMP:20170413T185736Z
DESCRIPTION:sdfg\n\nSome awesome description
DTSTART:20170419T180000
DURATION:PT3H0M0S
LOCATION:The best place in the world
SUMMARY:One fine summary
END:VEVENT
END:VCALENDAR

0

Решение

Спустя годы, но вот как это работает для меня, и, возможно, это поможет любому, кто столкнется с этим вопросом.

Я никогда не пробовал TZOFFSETFROM … так что не уверен, что это такое, и даже если он должен работать. Однако, если вы установите часовой пояс в DTSTART и DTEND, он будет автоматически настроен. Вам просто нужно, чтобы дата была в UTC, как ваша дата, измененная в последний раз. Я делаю это так ($start а также $end являются объектами PHP DateTime):

"DTSTART:".$start->setTimezone(new DateTimeZone('UTC'))->format('Ymd\THis\Z').$eol.
"DTEND:".$end->setTimezone(new DateTimeZone('UTC'))->format('Ymd\THis\Z')

Таким образом, в основном все, что нужно сделать, это поместить дату в часовой пояс UTC, а затем отформатировать дату / время с Z в конце, чтобы сообщить это клиенту.

Полный рабочий пример (если он полезен для всех):

<?php
date_default_timezone_set('America/New_York');
//CONFIGURE HERE
$fromName           = "John Doe";
$fromEmail          = "[email protected]";
$toName             = "Your Name";
$toEmail            = '[email protected]';
$start              = new DateTime('2017-08-15 15:00');
$end                = new DateTime('2017-08-15 16:00');
$summary            = "Hello World Event";
//END CONFIGURATION

$uid                = "0123456789";
$headers            = array();
$boundary           = "_CAL_" . uniqid("B",true) . "_B_";
$headers[]          = "MIME-Version: 1.0";
$headers[]          = "Content-Type: multipart/alternative; boundary=\"".$boundary."\"";
$headers[]          = "To: \"{$toName}\" <{$toEmail}>";
$headers[]          = "From: \"{$fromName}\" <{$fromEmail}>";

$calendarLines      = array(
"BEGIN:VCALENDAR",
"METHOD:REQUEST",
"PRODID:-//PHP//MeetingRequest//EN",
"VERSION:2.0",
"BEGIN:VEVENT",
"ORGANIZER;CN={$fromName}:MAILTO:{$fromEmail}",
"ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN={$toName}:MAILTO:{$toEmail}",
"DESCRIPTION:{$summary}",
"SUMMARY:{$summary}",
"DTSTART:".$start->setTimezone(new DateTimeZone('UTC'))->format('Ymd\THis\Z'),
"DTEND:".$end->setTimezone(new DateTimeZone('UTC'))->format('Ymd\THis\Z'),
"UID:{$uid}",
"CLASS:PUBLIC",
"PRIORITY:5",
"DTSTAMP:".gmdate('Ymd\THis\Z'),
"TRANSP:OPAQUE",
"STATUS:CONFIRMED",
"SEQUENCE:0",
"LOCATION:123 Any Street",
"BEGIN:VALARM",
"ACTION:DISPLAY",
"DESCRIPTION:REMINDER",
"TRIGGER;RELATED=START:-PT15M",
"END:VALARM",
"END:VEVENT",
"END:VCALENDAR");$calendarBase64     = base64_encode(implode("\r\n",$calendarLines));
//ensure we don't have lines longer than 70 characters for older computers:
$calendarResult     = wordwrap($calendarBase64,68,"\n",true);

$emailLines = array(
"--{$boundary}",
"Content-Type: text/html; charset=\"iso - 8859 - 1\"",
"Content-Transfer-Encoding: quoted-printable",
"",
"<html><body>",
"<h1>Hello World</h1>",
"<p>This is a calendar event test</p>",
"</body></html>",
"",
"--{$boundary}",
"Content-Type: text/calendar; charset=\"utf - 8\"; method=REQUEST",
"Content-Transfer-Encoding: base64",
"",
$calendarResult,
"",
"--{$boundary}--");
$emailContent   = implode("\n",$emailLines);

$headersResult      = implode("\n",$headers);
mail($toEmail, $summary, $emailContent, $headersResult );
echo("<pre>".htmlentities($headersResult)."\n\n".htmlentities($emailContent)."</pre>");
echo("<br /><br />");
echo("<pre>".base64_decode($calendarResult)."</pre>");
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]