好的,我正在使用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
那么有关如何处理时区和夏令时的任何建议吗?
提前致谢
答案 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;