使用ics日期/时间格式管理php中的时区

时间:2010-04-09 15:10:33

标签: php date time icalendar

好的,我正在使用ICS解析器实用程序来解析谷歌日历ICS文件。它工作得很好,除了谷歌给我提供了UCT事件的时间..所以我现在需要减去5个小时,以及夏令时发生的6个小时。

要获得我正在使用的开始时间:

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

那么有关如何处理时区和夏令时的任何建议吗?

提前致谢

2 个答案:

答案 0 :(得分:8)

只是不要使用代码的substr()部分。 strtotime能够解析yyyymmddThhiissZ格式化的字符串,并将Z解释为timezone = utc。

e.g。

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

(输出相同)

答案 1 :(得分:0)

如果您已设置时区区域设置,则还可以使用将返回当前时区的日期(“T”)。

echo date("T");

因为我们处于夏令时,(在我的时区)它会返回:     EDT

然后你可以在IF语句中使用它来调整你的时区调整。

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