2013-05-14 1 views
0

PHP에서 ics 파일을 동적으로 생성하려고합니다. 여기서 시간대는 주어진 위치에 따라 동적입니다. 모든 것이 잘 작동하지만 일광 시간 문제가 있습니다. 즉 1 시간 정도의 시간차가 있습니다. 이제이 문제를 해결하려면 DAYLIGHT을 동적으로 사용해야합니다. 하지만 동적으로 사용하는 방법을 모르거나 주어진 시간대와 관련된 TZOFFSETFROMTZOFFSETTO 오프셋을 어디서 얻을 수 있습니까? 예를 들어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; 

지금 어떻게 동적으로 위치에 따라 일광을 사용하는 .. 사전에 등

$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

Matt 씨를 지원해 주셔서 감사합니다. – 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

왜 이것이 대답입니까? '$ start_zone = date ('O', time())를 사용했기 때문에 원래 질문의 핵심 인'TZOFFSETFROM'과'TZOFFSETTO' 값을 동적으로 채우는 방법을 다루지 않았습니다 –

+0

괜찮 았던 것 같아요.); // TZOFFSETFROM' 그리고 나서'date_default_timezone_set ($ timeZone);을 설정하고'$ end_zone = date ('O', time());'를 TZOFFSETTO에 설정합니다. – Bheem

1

도움이 될 수 있습니다, I 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); 

편집 : 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";