2010-04-09 66 views
2

好吧,我正在使用ICS解析器實用程序來解析Google日曆ICS文件。它的效果很好,除了谷歌給我UCT事件的時間。所以我需要現在減去5小時,以及夏令時6小時。使用ics日期/時間格式在php中管理時區

爲了讓我使用的開始時間:

$timestart = date("g:iA",strtotime(substr($event['DTSTART'], 9, -3))); 
//$event['DTSTART'] feeds me back the date in ICS format: 20100406T200000Z 

因此,任何建議如何處理時區和夏令時?

在此先感謝

回答

7

只要不使用代碼的SUBSTR()的一部分。 strtotime能夠解析格式化爲yyyymmddThhiissZ的字符串,並將Z解釋爲timezone = utc。

例如

$event = array('DTSTART'=>'20100406T200000Z'); 
$ts = strtotime($event['DTSTART']); 

date_default_timezone_set('Europe/Berlin'); 
echo date(DateTime::RFC1123, $ts), "\n"; 

date_default_timezone_set('America/New_York'); 
echo date(DateTime::RFC1123, $ts), "\n"; 

打印

Tue, 06 Apr 2010 22:00:00 +0200 
Tue, 06 Apr 2010 16:00:00 -0400 

編輯:或使用DateTime和DateTimezone類

$event = array('DTSTART'=>'20100406T200000Z'); 
$dt = new DateTime($event['DTSTART']); 

$dt->setTimeZone(new DateTimezone('Europe/Berlin')); 
echo $dt->format(DateTime::RFC1123), "\n"; 

$dt->setTimeZone(new DateTimezone('America/New_York')); 
echo $dt->format(DateTime::RFC1123), "\n"; 

(輸出是一樣的)

+0

使用日期(日期時間:: RFC1123,$ TS)它打印:週五,1970年8月21日10時26分52秒-0500對於 「20100406T200000Z」 – John 2010-04-09 17:04:00

+0

事實上,對於使用 「20100406T200000Z」 格式的所有日期,它是輸出1970年8月21日星期五的唯一變化就是時間。這就是爲什麼我去了substr方法,所以我可以得到正確的時間。這是我的php ini文件的問題嗎?這在Windows Server 2003上運行。 – John 2010-04-09 17:15:01

+0

我已經用php 5.3.2/winxp測試過它。你使用哪個版本? – VolkerK 2010-04-09 17:23:28

0

如果你設置你的時區的區域設置,您也可以使用返回當前時區的日期(「T」)。

echo date("T"); 

因爲我們是在夏令時,(在我的時區)返回: EDT

然後,你可以使用,在IF語句調整時區調整。

if (date("T") == 'EDT') 
    $adjust = 6; 
else 
    $adjust = 5;