На разных серверах FROM_UNIXTIME возвращает разное время

FB3

Новичок
На разных серверах FROM_UNIXTIME возвращает разное время

Делаю локально у себя в PHP strtotime('17/Oct/2010:06:04:13 +0400'), получаю цифру 1287281053.

Выполняю на локальном сервере под Windows SELECT FROM_UNIXTIME(1287281053), получаю результат 2010-10-17 06:03:49
То же самое выполняю на удаленном сервере под Linux и получаю 2010-10-17 06:04:13, т.е. правильный результат.
Время у себя пробовал синхронизировать, не помогло.

Как такое может быть и отчего это может зависеть? Кол-во секунд от начала UNIX эпохи ведь не меняется и не зависит от времени, установленного на компьютере, соответственно, и результат должен быть одинаковым.

Версии MySQL серверов одинаковые 5.1.41, только на удаленном сервере с суффиксом community.
 

fixxxer

К.О.
Партнер клуба
FROM_UNIXTIME(unix_timestamp), FROM_UNIXTIME(unix_timestamp,format)

Returns a representation of the unix_timestamp argument as a value in 'YYYY-MM-DD HH:MM:SS' or YYYYMMDDHHMMSS.uuuuuu format, depending on whether the function is used in a string or numeric context. The value is expressed in the current time zone
 

FB3

Новичок
Блин, бред какой-то.
Так PHP ведь получается тоже делает strtotime на основании текущей timezone http://php.net/manual/en/function.strtotime.php . Да и вообще, для PHP +0400 явно указано. Но ранее еще делается date_default_timezone_set("Europe/Moscow");
Почему оно так по разному текущее время на компе использует?.. :(

Синхронизация времени с интернетом и перезапуск локального mysql не помогли.
 

fixxxer

К.О.
Партнер клуба
Ну на мой взгляд лучше вынести все операции преобразования localtime <-> unix timestamp либо целиком на уровень php либо целиком на уровень MySQL. Иначе из за случайного недосмотра в настройках все может "поехать".
 

FB3

Новичок
Автор оригинала: fixxxer
Ну на мой взгляд лучше вынести все операции преобразования localtime <-> unix timestamp либо целиком на уровень php либо целиком на уровень MySQL. Иначе из за случайного недосмотра в настройках все может "поехать".
Да мне нужно один раз табличку пропатчить, в новое поле данные внести из лога, а привязаться могу только по времени, и то на 1 секунду разница есть, но это не критично.
Похоже, что придется в PHP писать что-то типа $from = date('Y-m-d H:i:s', strtotime($str)) и $to = date('Y-m-d H:i:s', strtotime($str)+2) и потом подставлять значения в BETWEEN.
Целиком на уровень mysql не получится, не нравится ему такой формат времени, как в логе, а PHP отлично такой формат съедает.
 

Активист

Активист
Команда форума
> SELECT FROM_UNIXTIME(1287281053), получаю результат
> 2010-10-17 06:03:49

> То же самое выполняю на удаленном сервере под Linux
> получаю результат 2010-10-17 06:04:13
Хм.. Тут разница в несколько секунд, о каких Time Zone вы говорите?

Вот код - первый выполнен на Debian Lenny, Второй на Windows 2003
Код:
serv002:~# mysql -u su1234
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1924
Server version: 5.0.51a-24+lenny4 (Debian)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SELECT FROM_UNIXTIME(1287281053)
    -> ;
+---------------------------+
| FROM_UNIXTIME(1287281053) |
+---------------------------+
| 2010-10-17 11:04:13       |
+---------------------------+
1 row in set (0.00 sec)

mysql> Bye
serv002:~# mysql -u su1234 -h mysql.local
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 19138
Server version: 5.0.18-nt-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SELECT FROM_UNIXTIME(1287281053);
+---------------------------+
| FROM_UNIXTIME(1287281053) |
+---------------------------+
| 2010-10-17 11:04:13       |
+---------------------------+
1 row in set (0.00 sec)

mysql>
Телепат- невнимательность.
 

FB3

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

Активист

Активист
Команда форума
FB3
Невнимательность! Не может у тебя отличаться результат, количество прошедших секунд с 1970-01-01 постоянны, они могут корректироваться только тайм зоной, но тогда разница будет кратна 1800 (3600).

Покажи копипаст SQL из консоли на своих двух серверах, которые разные результаты показывают.

-~{}~ 26.10.10 16:56:

FB3
Да, таймзоны у нас с тобой разные, а результат одинаков (у меня +5 мск), так что SQL не корректирует результат этой функции.
 

FB3

Новичок
Код:
D:\xampp\mysql\bin>mysql -hlocalhost -uxxx -pxxx
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 40
Server version: 5.1.41 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT FROM_UNIXTIME(1287281053);
+---------------------------+
| FROM_UNIXTIME(1287281053) |
+---------------------------+
| 2010-10-17 06:03:49       |
+---------------------------+
1 row in set (0.00 sec)

mysql> exit
Bye

D:\xampp\mysql\bin>mysql -hremotehost -uxxx -pxxx
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 53415844
Server version: 5.1.41-community MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT FROM_UNIXTIME(1287281053);
+---------------------------+
| FROM_UNIXTIME(1287281053) |
+---------------------------+
| 2010-10-17 06:04:13       |
+---------------------------+
1 row in set (0.00 sec)

mysql> exit
Bye
Локальная версия из набора XAMPP под винду, как видно по путям запуска.
 

Активист

Активист
Команда форума
Оба x86 ?
Хм.... Разница в 14 секунд....
К локальному времени уж точно не привязано.

> Локальная версия из набора XAMPP
Я не знаю что такое XAMPP.

Имхо, установить надо официальный дистрибутив.
 

FB3

Новичок
Локальный x86 под семеркой, удаленный скорей всего под x64 линуксом, ред хат какой-нибудь, точно не знаю.

Думаю, проблема не в официальности дистрибутива.

А XAMPP - это тот же Денвер, только в профиль.
 

Активист

Активист
Команда форума
FB3
Да мне даже интересно стало, разница в 14 секунд, на лицо что-то особенное, с разрядностью, временными зонами, и т.п. явно не связано.

Версии одинаковые, у меня на x86 все сервера, значит не в разрядости. Ты выясняй давай что у тебя там на виндос сервере не так.
 

FB3

Новичок
На другом компе на той же версии из того же XAMPP такой же косяк.
Надо попробовать другую версию что-ли...

-~{}~ 26.10.10 19:55:

Разница в 24 секунды, а не 14. Проблема в настройках таймзоны MySQL.

http://ru.wikipedia.org/wiki/Секунда_координации

http://www.apachefriends.org/f/viewtopic.php?f=16&t=40578
Закомментил в конфиге, как выше пишут, стало как на удаленном серваке, т.е. локально теперь тоже правильно.

Попробовал поэксперементировать, удаленный сервак вообще не знает такой таймзоны:
SET time_zone = 'Europe/Moscow';

А на локальном отлично выполняется эта команда, но появляется косяк с этими 24 секундами.

Сейчас у меня в PHP коде делаются запросы к базе на установку таймзоны, похоже, что надо будет отключить их, иначе локально эти функции работают не так, как на серверах. Хотя, может надо покопаться и на серверах и узнать, почему им такая таймзона неизвестна. На них используется системное время и мой запрос при соединении никак не влияет на это.

Хотя, логичнее и правильнее все таки выглядит значение, которое возвращается как раз при установленной таймзоне. Т.е., если посмотреть с другой стороны, то косяк на самом деле в PHP.
 

vovanium

Новичок
Попробовал поэксперементировать, удаленный сервак вообще не знает такой таймзоны:
Вот здесь написано как добавить таймзоны,
http://dev.mysql.com/downloads/timezones.html
там есть таймзоны с секундами коррекции и без них.
так что тебе проще всего скачать POSIX таймзоны для своего XAMPPа, и всё будет совпадать с удаленным серваком
 

FB3

Новичок
vovanium на данный момент я вижу проблему в том, что PHP не учитывает эти 24 секунды когда делает strtotime.
ИМХО, mysql работает правильно, когда установлена таймзона и неправильно, когда не установлена.

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

vovanium

Новичок
FB3
Я же тебе дал ссылку, на сайте мускуля есть два файла с таймзонами, POSIX по которому работает в том числе PHP, и по умолчанию MySQL, а в твой XAMPP, просто залили таймзоны с секундами коррекции.
Так что просто скачай POSIX таймзоны http://downloads.mysql.com/general/timezone_2010l_posix.zip
и распакуй в каталог mysql/data/mysql/ (предварительно выключив мускуль, и всё будет совпадать).

Кстати еще один повод не юзать всякие денвер, xampp и подобные, а то потом веселые глюки проскакивают из-за их оптимизаций...

-~{}~ 27.10.10 17:25:

но если более серьезный софт будет создаваться - тогда это может оказаться проблемой.
Ага, а в денвере например в мускуле по умолчанию выставлена кодировка cp1251, а не стандартная latin1, и потом народ очень удивляется почему после переноса на хостинг коверкаются кодировки, а всё из-за нестандартной настройки денвера...
 

FB3

Новичок
Да у меня локально вообще все хитро установлено сейчас :)
MySQL из XAMPP, а Apache и PHP от ZendServer :)

Я считаю, что в PHP тоже должно быть с секундами коррекции, а в MySQL все правильно залито.
 

vovanium

Новичок
FB3
Я считаю, что в PHP тоже должно быть с секундами коррекции
Нафига это нужно? Эти таблицы придется регулярно обновлять, так как коррекционные секунды не по формулам считаются, а по астрологическим наблюдениям. Соответственно если на одном серваке вовремя обновишь таймзоны, а на другом нет, то опять будет расхождение...
 

FB3

Новичок
vovanium, ну в серьезных проектах эти секунды могут создать проблемы, если они не будут соответствовать реальному времени.
 

Активист

Активист
Команда форума
Дурдом.

ЗЫ. Вот такими вот 24 секундами пилится бюджеты!
Доказал хню, получил профит)) Распил похлеще глобального потепления/похолодания ))
 
Сверху