iCaldendar - Как PHP будет правильно применять часовой пояс, время начала и окончания в файле ics?

Почему следующие startTime и endTime в календаре Outlook и Mac не вставляются с точным временем, как показано ниже?

Вход:

$timezone = 'Europe/Luxembourg';
$startTime =  "2016-11-03 18:00:00";        
$endTime =  "2016-11-03 19:00:00";

iCalender.ics:

    $icalender_for_outlook_n_osx = 
    'BEGIN:VCALENDAR' . "\r\n" .
    'VERSION:2.0'. "\r\n" .
    'PRODID:-//hacksw/handcal//NONSGML v1.0//EN'.
    'BEGIN:VEVENT'. "\r\n" .
    'DTEND:' . date("Ymd\THis", strtotime($endTime))  . "\r\n" .
    'UID:'. uniqid() . "@".$domain . "\r\n". 
    'DTSTAMP:'. time() . "\r\n".
    'LOCATION:' . $location . "\r\n".
    'DESCRIPTION:'. $uri . "\r\n" .
    'URL;VALUE=URI:' . $uri . "\r\n" .
    'SUMMARY:'. $subject . "\r\n" .
    'DTSTART:'. date("Ymd\THis", strtotime($startTime)) . "\r\n" .
    'PRIORITY:5'. "\r\n" .         
    'END:VEVENT'. "\r\n" .
    'END:VCALENDAR'. "\r\n";

Outlook или в календаре Mac время начала и окончания либо показывает несколько часов назад, либо вперед, никогда не получая значение, которое я внедрил. Как вы точно указываете часовой пояс PHP и время начала/даты точно так же, как указано выше?


person Community    schedule 05.11.2016    source источник
comment
Это потому, что strtotime() анализирует метку времени как европейский формат даты d-m-y, когда используется -. Возможно, лучше использовать date_create_from_format()   -  person Xorifelse    schedule 06.11.2016
comment
он правильно создал время как: 20161106T001126Z, но когда я добавил в календарь, внутри календаря дата в порядке, но время показывает 01:11 ???   -  person    schedule 06.11.2016
comment
Что ж, если я выполню echo date("Ymd\THis", strtotime("2016-11-03 18:00:00"));, это даст мне 20161103T180000, что кажется более правильным, чем ваше 20161106, где 06 — неправильный день, а время 001126 — 0 часов, 11 минут и 26 секунд.   -  person Xorifelse    schedule 06.11.2016


Ответы (1)


Я твердо верю, что следует избегать strtotime() и создавать дату и время из формата.

$format = 'Y-m-d H:i:s';
$icalformat = 'Ymd\THis';
$startTime = '2016-11-03 18:00:00';        
$endTime   = '2016-11-03 19:00:00';

echo DateTime::createFromFormat($format, $startTime)->format($icalformat); // 20161103T180000
echo DateTime::createFromFormat($format, $endTime)->format($icalformat); //   20161103T190000
person Xorifelse    schedule 06.11.2016