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

使用PHP解析Google日历XML-结束日期缩短了一天,php,xml,google-calendar-api,utc,Php,Xml,Google Calendar Api,Utc,我正在尝试制作一个网页,让谷歌日历上的下三个事件显示在主页上。我一直在使用这个PHP(http://james.cridland.net/code/google-calendar.html)访问我的XML提要并将其格式化为HTML 我遇到的问题是,由于某种原因,新的一天从上午11点开始。例如,如果我的谷歌日历上有一个12月20日上午10点开始的持续一小时的事件,我的PHP输出将显示一个从20日上午10点开始到21日上午11点结束的事件。否则,它工作正常 我已经在我的谷歌日历账户上用PHP使用da

我正在尝试制作一个网页,让谷歌日历上的下三个事件显示在主页上。我一直在使用这个PHP(http://james.cridland.net/code/google-calendar.html)访问我的XML提要并将其格式化为HTML

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

我已经在我的谷歌日历账户上用PHP使用
date\u default\u timezone\u set(“太平洋/奥克兰”)将时间设置为本地(新西兰)时间

计算完成日期的可怕行是

$gCalDateEnd = date($dateformat, strtotime($ns_gd->when->attributes()->endTime)+date("Z",strtotime($ns_gd->when->attributes()->endTime)));
其中$dateformat是一个日期格式的字符串

GoogleCalendarXML提供了

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点


怎么回事

试试google calendar的zend框架(它比重新发明轮子对我更有效):(看看这些例子,它们非常简单而且有用)

这句话确实很可怕:

$gCalDateEnd = date($dateformat, strtotime($ns_gd->when->attributes()->endTime)+
    date("Z",strtotime($ns_gd->when->attributes()->endTime)));
我可以很好地处理这种类型的日期。此代码片段可能是在假定
strotime
取消时区并返回UTC格式的日期时间的情况下编写的,因此需要手动计算时区“校正”-这就是
+日期(“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));

谢谢,我就知道会是这样。从我在他的代码变更日志中读到的内容来看,听起来他好像在尝试使用+date('Z',…)来解释夏令时,但XML似乎表明谷歌已经使用+13来实现这一点。我最初曾考虑过使用它,但担心我会使网站过于复杂,无法在将来维护(这是一个非盈利俱乐部,所以很可能会由技能最低的人来照顾)。但是在看了这些例子之后,我可能会尝试一下。谢谢你的建议!