我正在尝试创建一个网页,并在主页上显示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");
计算完成日期的可怕线是
$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点的时间范围。
怎么回事?!?!
答案 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));