как остановить изменения летнего времени при использовании Ical?

Обычно, когда пользователь нажимает на кнопку загрузки, я использую href="download.php" и с того дня я добавляю 84 календарных уведомления в календарь пользователей.

Проблема у меня заключается в том, что летнее время происходит, и внезапно оно меняется на 09:00 после этого летнего времени.

Я хочу остановить это и удостовериться, что все уведомления календаря получают 08:00.

Но я не могу понять, как это сделать.

Это мой код download.php:

<?php
header("Content-type: text/calendar");//iphone
header("Content-Disposition: attachment; filename=pillintake.ics");//iphone
// the iCal date format. Note the Z on the end indicates a UTC timestamp.
define('DATE_ICAL', 'Ymd\THis\Z');

// max line length is 75 chars. New line is \\n$output = "BEGIN:VCALENDAR
METHOD:PUBLISH
VERSION:2.0
PRODID:-//dev//test Schedule//EN\n";

$startTime = strtotime( date('Y-m-d 08:00') );
$endTime = strtotime($Date. ' + 84 days');$startTime = str_replace("Z","",$startTime);

// Loop between timestamps, 24 hours at a time
$count = 1;
for ( $i = $startTime; $i <= $endTime; $i = $i + 86400 ) {

$currentDate =  date(DATE_ICAL, $i);
$output .=
"BEGIN:VTIMEZONE
TZID:Europe/Stockholm
X-LIC-LOCATION:Europe/Stockholm
BEGIN:DAYLIGHT
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
TZNAME:CEST
DTSTART:19700329T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
TZNAME:CET
DTSTART:19701025T030000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
SUMMARY:Ta din tablett
DESCRIPTION: Glöm inte! \n\n
UID:0000".$count."STATUS:OK
DTSTART:" . $currentDate . "DTEND:" .$currentDate . "LAST-MODIFIED:" .$currentDate . "LOCATION:
END:VEVENT\n";
$count = $count +1;
}$output .= "END:VCALENDAR";

echo $output;

?>

0

Решение

Ваш код выглядит хорошо, но есть кое-что, что вам может потребоваться проверить.
Если ваше значение DTSTART содержит «Z», вам необходимо удалить его.

Пожалуйста, попробуйте следующий код:

...
$currentDate =  date(DATE_ICAL, $i);
$currentDate = str_replace("Z","",$currentDate);
$output .=
"BEGIN:VTIMEZONE
TZID:Europe/Stockholm
X-LIC-LOCATION:Europe/Stockholm
BEGIN:DAYLIGHT
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
TZNAME:CEST
DTSTART:19700329T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
TZNAME:CET
DTSTART:19701025T030000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
SUMMARY:Ta din tablett
DESCRIPTION: Glöm inte! \n\n
UID:0000".$count."STATUS:OK
DTSTART;TZID=Europe/Stockholm:" . $currentDate . "DTEND;TZID=Europe/Stockholm:" .$currentDate . "LAST-MODIFIED:" .$currentDate . "LOCATION:
END:VEVENT\n";
$count = $count +1;
}

...

Надеюсь это поможет

1

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

Хотя твой вопрос как остановить переход на летнее время Я предполагаю, что вы просто хотите, чтобы ваше уведомление всегда происходило в одно и то же местное время независимо от DST,

Вы почти там с вашим файлом календаря. Ключевой момент, как вы сделали, чтобы определить VTIMEZONE компонента, но вы также должны указать инструменту календаря, какое свойство события (DTSTART, DTEND, …) должен использовать это TZID имущество

в вашем случае ваше напоминание должно иметь две строки, как это


DTSTART; TZID = Европа / Стокгольм: 20160323T00000
DTEND; TZID = Европа / Стокгольм: 20160323T00000

Для более подробной информации вы можете обратиться к RFC5545- Идентификатор часового пояса а также RFC5545 — компонент события

1

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