2013-05-14 3 views
0

Я пытаюсь динамически генерировать файл ics в PHP, где часовой пояс является динамическим в соответствии с заданным местоположением. Все работает хорошо, но есть проблема с дневным освещением, то есть показывается разница во времени в течение одного часа. Теперь, чтобы решить эту проблему, я должен динамически использовать DAYLIGHT. но я не знаю, как использовать его динамически или где я могу получить TZOFFSETFROM и TZOFFSETTO смещения, связанные с заданным часовым поясом.Проблема динамического часового пояса ICS

Для примера:

$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:[email protected]\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}[email protected]\n"; 
     $ical .= "END:VEVENT\n"; 
     $ical .= "END:VCALENDAR";  

echo $ical; 

Теперь, как использовать дневной свет динамически в зависимости от местоположения, как местоположение может быть 'Америка/Caracas' .. и т.д.

$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"; 

Спасибо заранее.

+0

Вы можете быть в состоянии использовать информацию из 'DateTimeZone :: getTransitions' заполнить значения правильно. См. [Эти документы] (http://www.php.net/manual/en/datetimezone.gettransitions.php). –

+0

Спасибо Мэтту за вашу поддержку. – Bheem

+0

Не используйте «Z» в конце вашей даты и времени, потому что в этом случае Outlook и iCal будут использовать это время в формате UTC и пересчитывать его в соответствии с вашим местным часовым поясом. – Anonymous

ответ

0

До преобразования времени и даты, вы должны установить правильный часовой пояс в 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" 

Надежда это может помочь

+0

Спасибо, это имеет смысл. :) – Bheem

+0

Почему это принятый ответ? В нем не говорится, как динамически заполнять значения 'TZOFFSETFROM' и' TZOFFSETTO', что было сердцем исходного вопроса –

+0

Я думаю, что он работал нормально, поскольку я использовал '$ start_zone = date ('O', time()); // TZOFFSETFROM', а затем я устанавливаю 'date_default_timezone_set ($ timeZone);' и далее устанавливаю '$ end_zone = date ('O', time());' для TZOFFSETTO – Bheem

1

На самом деле, я имеют 1-дневную продолжительность события, и вот что я сделал, я думаю, что это работает отлично для меня, но я не уверен на 100%, поэтому, пожалуйста, помогите мне, если я где-то не так. Спасибо @ Ph.T и @Matt Johnson за поддержку.

$timeZone = "America/Denver" // dynamically fetched from DB 

    $date = date('Y-m-d', strtotime($event_date)); 

    $start_time = date('H:i:s', strtotime($event_start_time)); 
    $start_timestamp = strtotime(date($date .' '.$start_time)); 

    $end_time = date('H:i:s', strtotime($event_end_time)); 
    $end_timestamp = strtotime(date($date .' '.$end_time));  

    $start_date = date('Ymd', strtotime($event_date)) ."T". date('His', $start_timestamp); 
    $end_date = date('Ymd', strtotime($event_date)) ."T". date('His', $end_timestamp); 

EDIT:
По Ph.T: Вы не должны использовать время(), но $ start_time и $ end_time быть последовательным и более правильным. Однако это не имеет никакого значения, поскольку начальная зона такая же, как сейчас, завтра или через миллион лет, если вы не используете летнее время. Единственный пробел, который у вас может быть, заключается в том, что есть эффективный переход на летнее время между «сейчас» и «датой начала», например, например, вы назначили событие на следующую неделю, пока время будет изменено в этот уик-энд. Не все страны используют летнее время.

$start_zone = date('O', strtotime($event_start_time)); // TZOFFSETFROM format of "right now" 
    date_default_timezone_set($timeZone); 
    $end_zone = date('O', strtotime($event_end_time); // TZOFFSETTO of "right now" 

И поэтому

$ical .= "BEGIN:VTIMEZONE\n"; 
    $ical .= "TZID:{$timeZone}\n"; 
    $ical .= "TZURL:http://tzurl.org/zoneinfo-outlook/{$timeZone}\n"; 
    $ical .= "X-LIC-LOCATION:{$timeZone}\n"; 
    $ical .= "BEGIN:DAYLIGHT\n"; 
    $ical .= "TZOFFSETFROM:{$start_zone}\n"; 
    $ical .= "TZOFFSETTO:{$end_zone}\n"; 
    $ical .= "TZNAME:". date("T")."\n"; 
    $ical .= "DTSTART:{$start_date}\n"; 
    $ical .= "RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\n"; 
    $ical .= "END:DAYLIGHT\n"; 
    $ical .= "BEGIN:STANDARD\n"; 
    $ical .= "TZOFFSETFROM:{$start_zone}\n"; 
    $ical .= "TZOFFSETTO:{$end_zone}\n"; 
    $ical .= "TZNAME:".date("T")."\n"; 
    $ical .= "DTSTART:{$start_date}\n"; 
    $ical .= "RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\n"; 
    $ical .= "END:STANDARD\n";  
    $ical .= "END:VTIMEZONE\n"; 
Смежные вопросы