2015-11-30 58 views
0

我正在開發一個PHP工具來創建一個ICS文件,將通過郵件發送。錯誤的ICS文件中的時間

創建文件後,我嘗試將其添加到Outlook 2016或iCalendar(Apple)中。除開始時間和結束時間外,所有信息都是正確的。他們從一個小時抵消。

Exemle:

BEGIN:VCALENDAR 
METHOD:PUBLISH 
VERSION:2.0 
PRODID:-//Communication Maker 
CALSCALE:GREGORIAN 
BEGIN:VEVENT 
DTSTART;TZID=Europe/Zurich:20151201T150000Z 
DTEND;TZID=Europe/Zurich:20151201T180000Z 
UID:565c50b5ca7d9 
LOCATION:Location 
SUMMARY:Title 
DESCRIPTION:Content 
END:VEVENT 
END:VCALENDAR 

以下是該文件的信息:

開始時間:2015年1月12日@ 15:00:00

結束時間:01/12/2015 @ 18:00:00

Timezone:UTC +01:00(Europe /蘇黎世)

在這裏,在Outlook和的iCalendar結果:

開始時間:2015年1月12日@ 16:00:00

結束時間:01/12/2015 @ 19:00:00

我已經搜索了4天,我無法找到正確數據的事件的答案。

如果需要,我可以給你更多我的代碼(HTML或PHP類)。

有我的課:

class ICS { 

    private $sSaveDir  = './icsFiles/'; 
    private $sIcsContent  = ''; 
    private $sIcsDateFormat = 'Ymd\THis\Z'; 

    public function __construct($sTitle = null, $sLocation = null, $sUrl = null, $sTimezoneValue = null, $sEventText = null, $sDateS = null, $sTimeS = null, $sDateE = null, $sTimeE = null) { 

     // Timezone par défaut 
     date_default_timezone_set('UTC'); 

     // Génération de l'ID unique 
     $sUniqId = uniqid(); 

     // Construction du array 
     $aIcsContent = array(
      "BEGIN:VCALENDAR", 
      "METHOD:PUBLISH", 
      "VERSION:2.0", 
      "PRODID:-//Communication Maker", 
      "CALSCALE:GREGORIAN", 
      "BEGIN:VEVENT", 
      "DTSTART;TZID=".$sTimezoneValue.":".date($this->sIcsDateFormat, strtotime($sDateS." ".$sTimeS)), 
      "DTEND;TZID=".$sTimezoneValue.":".date($this->sIcsDateFormat, strtotime($sDateE." ".$sTimeE)), 
      "UID:".$sUniqId, 
      "LOCATION:".$sLocation, 
      "SUMMARY:".$sTitle, 
      "DESCRIPTION:".$sEventText, 
      "END:VEVENT", 
      "END:VCALENDAR" 
     ); 

     // Array => string 
     $this->sIcsContent = implode(PHP_EOL, $aIcsContent); 

     // Créer et ouvre le fichier en écriture seule 
     if($oIcsFile = fopen($this->sSaveDir.'event_'.$sUniqId.'.ics', 'w')) { 

      // Inscrit les données de l'événement dans le fichier 
      fwrite($oIcsFile, $this->sIcsContent); 

      // Ferme le fichier proprement 
      fclose($oIcsFile); 

      echo 'true'; 
     } 
     else { 

      echo 'false'; 
     } 

    } 

} 

謝謝您的幫助。我真的需要它。

回答

1

您的ICS文件顯示時間爲2015年1月12日@ 15:00:00 UTC時區。它說要在蘇黎世時間顯示時間。蘇黎世是UTC + 100,因此將時間顯示爲蘇黎世時間01/12/2015 @ 16:00:00(中歐時間)是正確的。

20151201T150000Z末尾的Z表示「祖魯時間」,它是(大體上)UTC時間的另一個名稱。

爲了使日期/時間的事件開始在蘇黎世時指定,而不是UTC,簡單地丟棄從時間Z,就像這樣:20151201T150000

如果你想坐在UTC +人100看到15:00,而坐在UTC + 200的人看到16:00爲時間,則應該用UTC指定時間。在這種情況下,您將時間設置爲20151201T140000Z,因爲這是2015年12月1日15:00:00 UTC + 100的UTC等效時間。

+0

是的,但我想在UTC + 01:00顯示15:00。如果您使用UTC + 02:00的日曆打開日曆,則會看到16:00。 – SatanicGeek

+1

你是說你想坐在UTC + 200的人看到16:00,而坐在UTC + 100的人看到15:00? –

+0

是的,那正是我想要的。 – SatanicGeek