【问题标题】:Using PHP to parse a Google Calendar XML - End date is off by a day使用 PHP 解析 Google 日历 XML - 结束日期相差一天
【发布时间】:2011-12-11 10:13:24
【问题描述】:

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

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

我已在我的 Google 日历帐户中将时间设置为本地(新西兰)时间,并在 PHP 中使用 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 日历 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 点。

怎么了?!?!

【问题讨论】:

    标签: php xml google-calendar-api utc


    【解决方案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));
    

    【讨论】:

    • 谢谢,我知道会是这样。从我在他的代码的更改日志中读到的内容,听起来他正在尝试使用 +date('Z',...) 来说明夏令时,但 XML 似乎表明 Google 已经使用+13。
    【解决方案2】:

    试试 google 日历的 zend 框架(它比重新发明轮子更适合我):http://framework.zend.com/manual/en/zend.gdata.calendar.html(看看例子,它们很简单也很有帮助)

    【讨论】:

    • 我最初考虑过使用它,但害怕我会使网站过于复杂而无法在未来维护(它是一个非营利性俱乐部,所以很可能会由具有最低限度的技能)。但是在查看了示例之后,它看起来还不错,我可能会试一试。感谢您的建议!
    猜你喜欢
    • 2019-10-20
    • 1970-01-01
    • 2015-02-09
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 2019-05-21
    • 1970-01-01
    相关资源
    最近更新 更多