ошибка перехода на летнее время fullCalendar - PullRequest
4 голосов
/ 09 марта 2012

У меня есть приложение, созданное на основе fullCalendar на основе jQuery http://arshaw.com/fullcalendar/

Мои события календаря загружаются вызовом Ajax, который выводит JSON, для него настроен понедельник в качестве первого дня недели, а по умолчанию используется неделя.

Все работало нормально, но я заметил, что если я перейду к 13-й неделе (с 26 марта), события будут загружаться неправильно. Я сразу понял, что это как-то связано с переходом на летнее время, которое происходит 25 марта.

Когда я использую нажатие на кнопки «следующий / предыдущий», календарь выполняет ajax-вызов с использованием автоматически сгенерированного времени начала и окончания, мой php-скрипт на заднем плане берет дату начала, вычисляет номер недели и вызывает все события в моей базе данных. за эту неделю.

Например, на неделе 12 передаются следующие переменные:

? = 1332115200 начать и конец = 1332716400 & _ = 1331237729591

PHP скрипт:

$week_no = date('W', $_GET['start']);

, который работает как неделя № 12.

Однако на следующей неделе передаются следующие переменные:

? Начать = 1332716400 & конец = 1333321200 & _ = 1331238038820

$week_no = date('W',$_GET['start']); == 12 // same as last week

Nn дальнейшее обследование

echo date("C",1332115200);    // == 2012-03-19T00:00:00+00:00
echo date("C",1332716400);    //2012-03-25T23:00:00+00:00 (1 hour short of being in week 13)

Очевидно, что смена дневного света вызывает проблему.

У меня вопрос: это проблема с полным каландром или моя логика PHP?

Ответы [ 3 ]

3 голосов
/ 09 марта 2012

Прежде всего: я не знаю ваш код и ваши настройки, так что все, что я говорю, в значительной степени является предположением.

Если ваши системы настроены на UTC, не будетт (не должно) быть проблемой.То же самое касается правильного использования функций JavaScript date.getUTC * (fullCalendar не использует их) с сервером, установленным в UTC.Но я думаю, что только ваш сервер на самом деле настроен на UTC, тогда как ваш компьютер настроен на «Европа / Лондон» или что-то в этом роде (сейчас это выглядит как UTC, потому что зимой это UTC + 0).

Это все приводит к следующей ситуации: fullCalendar пытается вычислить временную метку, например, для 1 июля 2012 года 00:00:00 - потому что для компьютера установлен часовой пояс, в котором на эту дату применяется летнее время (UTC + 0 зимой, UTC + 1 летом -> 1 июля = UTC + 1) вы получите временную метку для того времени, когда 1 июля 00:00:00 В ЛОНДОНЕ .Поскольку их время составляет один час перед UTC, вы получите 23:00:00, если интерпретируете эту временную метку относительно UTC, а именно то, что делает сервер.

Решение может будет так просто:

<?php
date_default_timezone_set('Europe/London');

Таким образом, сервер должен интерпретировать отметку времени относительно UTC + 0, если соответствующая дата зимой, и относительно UTC + 1, если она находится влето.

Однако, если часовой пояс посетителей настроен на что-то другое, например, "America / Los_Angeles", ваше приложение все еще не работает и не будет работать должным образом.Лучше всего везде использовать временные метки UTC, но fullCalendar в настоящее время не поддерживает это.

0 голосов
/ 09 марта 2012

Также проверьте .... http://arshaw.com/fullcalendar/docs/event_data/ignoreTimezone/

это также может помочь

0 голосов
/ 09 марта 2012

Возможно, это зависит от часового пояса, поскольку даты перехода на летнее время в разных часовых поясах различны. Убедитесь, что часовой пояс, указанный в файле php.ini, совпадает с часовым поясом вашей страны.

Установка часового пояса также возможна с помощью функции date_default_timezone_set .

А вот список поддерживаемых часовых поясов.
http://php.net/manual/en/timezones.php

...