Ввожу в календарь однодневное событие 22 марта в 0 часов 01 минуту. Временная зона на форме GMT +3. Щелкаю на ОК, смотрю, как это событие отражается в календаре для пользователей. Оно показывается как 21 марта в 21 час 01 мин.
Настройки:
Админка - «Формат даты и времени»:
Часовой пояс сервера - GMT +3
Корректировка времени сервера (в минутах) - 0
Автоматический перевод часов - Да.
Версия IPB - 2.3.6 Rus
Настройки на сервере: временная зона сервера - MSK (GMT +3, автоматический переход на летнее время), время обновляется автоматически через ntpd.
Что делаю для диагностики.
1. Ввожу в календарь однодневное событие 22 марта без указания времени (событие длится весь день). Метка времени для него по логике должна быть установлена на первую секунду этих суток.
2. Смотрю в таблицу ibf_cal_events, поле event_unix_from:
Тестовое однодневное событие 22 марта - 1237680000
Тестовое событие в 0.01 мин. 22 марта - 1237669260 (на 10740 секунд, т.е. на 3 часа без одной минуты раньше)
Правильная полночь с 21 на 22 марта по Москве с учетом временной зоны +3 GMT - 1237669200.
Поле event_tz - 3 в обоих случаях.
Отчего возможна ошибка.
При вводе событий с указанием времени суток поле event_unix_from заполняется корректно, с учетом локальной временной зоны. Функция mktime, которая учитывает локальное время, дает на начало 22 марта по Москве 1237669200.
При вводе событий без указания времени суток поле event_unix_from заполняется некорректно, без учета локальной временной зоны. Функция gmmktime, которая считает время по Гриничу, дает на начало 22 марта на нулевом меридиане как раз 1237680000 - то число, которое мы и видим в таблице.
При выводе событий на странице календаря события снова некорректно пересчитываются по Гриничу, без учета временной зоны. Поэтому событие 22 марта в 0.01 минуту по московскому времени "съезжает" на предыдущую дату и показывается на странице календаря как событие 21 марта 21.01 мин.
Эта же проблема относится и к повторяющимся событиям: если событие не имеет указания на время суток, поле event_unix_from заполняется по Гриничу, если имеет - поле заполняется с учетом местного времени.
Резюме.
Если при вводе события в календарь пользователь поставил на форме галочку 'Если это событие не действует весь день, вы можете указать начальное время', то метка времени event_unix_from в таблицу вводится правильно, с учетом местного времени. Однако потом при выводе на странице календаря это событие может запросто "съехать" на предыдущую дату, т.к. страница формируется некорректно, без учета местного времени.
Если при вводе события в календарь пользователь не указал время, т.е. событие длится весь день, то метка времени event_unix_from в таблицу вводится некорректно, без учета временной зоны. Зато потом при выводе на странице календаря событие никогда никуда не съедет.
Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.
Вопрос
alexei1966
Описание:
Ввожу в календарь однодневное событие 22 марта в 0 часов 01 минуту. Временная зона на форме GMT +3. Щелкаю на ОК, смотрю, как это событие отражается в календаре для пользователей. Оно показывается как 21 марта в 21 час 01 мин.
Настройки:
Админка - «Формат даты и времени»:
Часовой пояс сервера - GMT +3
Корректировка времени сервера (в минутах) - 0
Автоматический перевод часов - Да.
Версия IPB - 2.3.6 Rus
Настройки на сервере: временная зона сервера - MSK (GMT +3, автоматический переход на летнее время), время обновляется автоматически через ntpd.
Что делаю для диагностики.
1. Ввожу в календарь однодневное событие 22 марта без указания времени (событие длится весь день). Метка времени для него по логике должна быть установлена на первую секунду этих суток.
2. Смотрю в таблицу ibf_cal_events, поле event_unix_from:
Тестовое однодневное событие 22 марта - 1237680000
Тестовое событие в 0.01 мин. 22 марта - 1237669260 (на 10740 секунд, т.е. на 3 часа без одной минуты раньше)
Правильная полночь с 21 на 22 марта по Москве с учетом временной зоны +3 GMT - 1237669200.
Поле event_tz - 3 в обоих случаях.
Отчего возможна ошибка.
При вводе событий с указанием времени суток поле event_unix_from заполняется корректно, с учетом локальной временной зоны. Функция mktime, которая учитывает локальное время, дает на начало 22 марта по Москве 1237669200.
При вводе событий без указания времени суток поле event_unix_from заполняется некорректно, без учета локальной временной зоны. Функция gmmktime, которая считает время по Гриничу, дает на начало 22 марта на нулевом меридиане как раз 1237680000 - то число, которое мы и видим в таблице.
При выводе событий на странице календаря события снова некорректно пересчитываются по Гриничу, без учета временной зоны. Поэтому событие 22 марта в 0.01 минуту по московскому времени "съезжает" на предыдущую дату и показывается на странице календаря как событие 21 марта 21.01 мин.
Эта же проблема относится и к повторяющимся событиям: если событие не имеет указания на время суток, поле event_unix_from заполняется по Гриничу, если имеет - поле заполняется с учетом местного времени.
Резюме.
Если при вводе события в календарь пользователь поставил на форме галочку 'Если это событие не действует весь день, вы можете указать начальное время', то метка времени event_unix_from в таблицу вводится правильно, с учетом местного времени. Однако потом при выводе на странице календаря это событие может запросто "съехать" на предыдущую дату, т.к. страница формируется некорректно, без учета местного времени.
Если при вводе события в календарь пользователь не указал время, т.е. событие длится весь день, то метка времени event_unix_from в таблицу вводится некорректно, без учета временной зоны. Зато потом при выводе на странице календаря событие никогда никуда не съедет.
Вопрос к знатокам: как это лечить.
Ссылка на комментарий
Поделиться на других сайтах
3 ответа на этот вопрос
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.