Использование PHP для анализа XML-файла Календаря Google - дата окончания отключена на один день - PullRequest
4 голосов
/ 11 декабря 2011

Я пытаюсь создать веб-страницу и показать следующие три события в Календаре Google на главной странице. Я использовал этот PHP (http://james.cridland.net/code/google-calendar.html) для доступа к своему XML-каналу и форматирования его в HTML.

У меня проблема в том, что по какой-то причине новый день начинается в 11 утра. Например, если в моем Календаре Google есть событие с 10 утра 20 декабря, которое длится час, мои выходные данные PHP будут показывать событие, которое начинается в 10 утра 20-го числа и заканчивается в 11 утра 21-го. В противном случае он работает нормально.

Я установил местное (Новая Зеландия) время в моей учетной записи Календаря 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 Calendar XML дает время начала и окончания

2011-12-22T10:00:00.000+13:00
2011-12-23T11:00:00.000+13:00

соответственно, и PHP рассчитывает период времени с 10:00 22 декабря 2011 года до 14:00 23 декабря 2011 года.

Что происходит?!?!

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

Эта строка действительно ужасна:

$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));
1 голос
/ 11 декабря 2011

Попробуйте Zend Framework для Google Calendar (это работало для меня лучше, чем изобретать колесо): http://framework.zend.com/manual/en/zend.gdata.calendar.html (посмотрите на примеры, они довольно просты и полезны)

...