#mysql #дата
select UNIX_TIMESTAMP('2008-11-02 00:59:00'); 1225601940 select UNIX_TIMESTAMP('2008-11-02 01:00:00'); 1225605600 select UNIX_TIMESTAMP('2008-11-02 01:00:00') - UNIX_TIMESTAMP('2008-11-02 00:59:00') 3660 Но UNIX_TIMESTAMP возвращает результат в секундах, почему разница 3660 секунд если должно быть 60?
Ответы
Ответ 1
Из UNIX_TIMESTAMP(date) документации: The server interprets date as a value in the current time zone and converts it to an internal value in UTC. emphasize mine то есть 2008-11-02 01:00:00 это не UTC время и поэтому значение UNIX_TIMESTAMP зависит от часового пояса, используемого базой данных (по умолчанию совпадает с поясом, используемым системной временно́й зоной). Часовой пояс может меняться, например, из-за перехода с летнего времени на стандартное (как упомянул @alexander barakin), местное время может прыгнуть на час назад, что увеличивает разницу в данном случае (из двух повторяющихся значений местного времени, выбрано более позднее). Пример, который явно смещение от UTC показывает (на Питоне): >>> import pendulum # $ pip install pendulum >>> dt = pendulum.create(2008, 11, 2, 0, 59, tz='America/New_York') >>> dt.timestamp() 1225601940.0 >>> dt.add(seconds=3660)>>> dt.add(seconds=60) Видно, что моменты времени +00:01:00 и +01:01:00 в будущее имеют одинаковое местное время 1am, но разные часовые пояса (с летнего на зимнее время переход произошёл): >>> dt.add(seconds=60).tzname() 'EDT' >>> dt.add(seconds=3660).tzname() 'EST' Ответ 2
дата 2008/11/02 — это второе воскресенье ноября, которое в некоторых странах (например, в канаде) является датой перевода часов с летнего на зимнее время (чаще всего именно в час ночи). выбором подобной временно́й зоны на сервере, где выполнялись указанные команды, и можно объяснить разницу в 61 минуту реального времени (измеряемого, в случае unix time stamp, секундами, прошедшими с полуночи первого января 1970 года) между двумя временны́ми отметками 2008-11-02 01:00:00 и 2008-11-02 00:59:00.
Комментариев нет:
Отправить комментарий