Проблемы при использование функций даты-времени связанные с отменой перехода на зимнее время.

opri

Новичок
Добрый день. Столкнулся с такой проблемой. Есть скрипт который получает временную метку даты.

PHP:
$а=strtotime("2010-12-19");
Результат пишется в базу.

Так для одной и той же даты “2010-12-19”, наблюдаю разные временные метки полученные в 2010 году, и получаемые сейчас. Отличаются на час. Функция date() возвращает правильные дату и время.

В 2010 году strtotime() давала 1292706000, сейчас при тестах возвращает 1292702400.
Похоже проблемма в настройках временной зоны PHP.
Тестовая среда:
1. версия PHP 5.2.12
2. ос Windows XP (часовой пояс GMT +04:00)
3. в Php.ini date.timezone не определенна
4. в phpinfo() "Olson" Timezone Database Version - 2009.19
5. в phpinfo() Default timezone - Asia/Dubai

Менял date.timezone на “Etc/GMT+0400” результат тот же. При значение = “Europe/Moscow” временные метки одинаковы, но соответственно date() возвращает время на час меньше.

Подскажите, у кого какие мысли на сей счет? Может кто сталкивался с такой проблемой?
 

Фанат

oncle terrible
Команда форума
а зачем делать strtotime от 2010-12-19?
Почему бы в базу прям так и не писать?
 

opri

Новичок
а зачем делать strtotime от 2010-12-19?
Почему бы в базу прям так и не писать?
Конечно можно переделать алгоритм, сейчас. И писать сразу в базу.
Но изначально было сделано так, поиск и сравнение дат осуществляется по временным меткам.

Но такая интересная проблема есть, и можно попасть на ошибку и в других случаях
 

Фанат

oncle terrible
Команда форума
метка времени имеет размерность в секундах
а дата - в днях.
тот, кто придумал делать сравнение дат по меткам времени - думал не совсем головой, мягко говоря.
 

opri

Новичок
Кто что использовать, и чем думал здесь не обсуждается. Обсуждает проблема.
А такая проблема есть, и она может вылезти в других случаях при работе с временем. И других людей.
 

kryoz

Новичок
Я бы сделал конвертер дат в базе и оперировал метками времени.

В противном случае, надо писать аналогичную логику для запросов на выборку дат.
Алгоритм выглядит так:
- Переводим дату в метку
- Выбранная дата раньше принятия закона о переводе времени и это зимний интервал?
- Если нет, то отдаем как есть
- Если да, то корректируем на 1 час
 

WMix

герр M:)ller
Партнер клуба
kryoz
я вижу выгоды этой инвестиции!, можно после всему миру продать эту библиотеку... онож у всех таже проблема...
 

MiksIr

miksir@home:~$
strtotime("2010-12-19") подразумевает strtotime("2010-12-19 00:00:00");
Ясно, что в зависимости от временной зоны и DST эта операция даст разное число секунд отсчитанных от 01.01.1970 00:00:00 во временной зоне UTC
Решений проблемы два.
1. Раз вы Europe/Moscow, то наверно в курсе изменений про перевод часов. А раз в курсе, то, наверно, в phpinfo() "Olson" Timezone Database Version - 2009.19 вас должно было насторожить. Обновите базу данных временных зон.
2. Используйте UTC временную зону. Метки у вас изменятся, зато будут в дальнейшем всегда постоянные.
 

opri

Новичок
strtotime("2010-12-19") подразумевает strtotime("2010-12-19 00:00:00");
Ясно, что в зависимости от временной зоны и DST эта операция даст разное число секунд отсчитанных от 01.01.1970 00:00:00 во временной зоне UTC
Решений проблемы два.
1. Раз вы Europe/Moscow, то наверно в курсе изменений про перевод часов. А раз в курсе, то, наверно, в phpinfo() "Olson" Timezone Database Version - 2009.19 вас должно было насторожить. Обновите базу данных временных зон.
2. Используйте UTC временную зону. Метки у вас изменятся, зато будут в дальнейшем всегда постоянные.

Да Вы все правильно говорите. Olson" Timezone Database Version - меня насторожила. Взял более свежую версию PHP (скачал denver). в php.ini уже стоит GMT +04:00 по умолчанию. Время правильно, результат с метками тот же.
Начал пробовать. Asia/Dubai, тоже самое. Europe/Moscow - время правильно, метки совпадают. Так что, надо переустанавливать PHP со свежей базой Timezone Database и Default timezone = Europe/Moscow.
 
Сверху