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

我正在尝试创建一个网页,并在主页上显示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点.

这是怎么回事?!?!

最佳答案 这条线确实太可怕了:

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

strtotime可以处理这种类型的ISO 8601日期就好了.这个代码片段可能是在假设strtotime取消时区并以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));
点赞