使用PHP解析Google日历XML - 结束日期已过了一天

时间:2011-12-11 10:13:24

标签: php xml google-calendar-api utc

我正在尝试创建一个网页,并在主页上显示Google日历上的下三个活动。我一直在使用这个PHP(http://james.cridland.net/code/google-calendar.html)来访问我的XML feed并将其格式化为HTML。

我遇到的问题是由于某种原因,新的一天从上午11点开始。例如,如果我的Google日历从12月20日上午10点开始,持续一个小时,我的PHP输出将显示一个事件,该事件从20日上午10点开始,到21日上午11点结束。否则它工作正常。

我已经在我的Google日历帐户上设置了本地(新西兰)时间,并使用date_default_timezone_set("Pacific/Auckland");

在PHP中设置了时间

计算完成日期的可怕线是

$gCalDateEnd = date($dateformat, strtotime($ns_gd->when->attributes()->endTime)+date("Z",strtotime($ns_gd->when->attributes()->endTime)));

其中$ dateformat是一个日期格式的字符串。

Google Calendar XML提供了

的开始和结束时间
2011-12-22T10:00:00.000+13:00
2011-12-23T11:00:00.000+13:00

,PHP正在计算2011年12月22日上午10点到2011年12月23日下午2点的时间范围。

怎么回事?!?!

2 个答案:

答案 0 :(得分:1)

尝试谷歌日历的zend框架(它比重新发明轮子更适合我):http://framework.zend.com/manual/en/zend.gdata.calendar.html(看看这些例子,它们非常简单和有用)

答案 1 :(得分:1)

这条线确实太可怕了:

$gCalDateEnd = date($dateformat, strtotime($ns_gd->when->attributes()->endTime)+
    date("Z",strtotime($ns_gd->when->attributes()->endTime)));

strtotime可以正常处理此类ISO 8601日期。这个代码片段可能是在假设strtotime解散时区并以UTC返回日期时间的情况下编写的,因此需要手动计算时区“校正” - 这就是+date("Z", ...)所代表的含义(与“Z”第二个参数 - 时间戳 - 实际上被忽略了)。

因此,在您的示例中,您的日期会增加13个小时。 10:00 + 13:00 = 23:00(晚上11点)仍在同一天,但11:00 + 13:00 = 24:00(上午12点)在新的一天实际上是00:00

所以转换日期的正确方法是:

$gCalDateEnd = date($dateformat, strtotime($ns_gd->when->attributes()->endTime));