MySQL записывает даты «как есть», также читает их так, но UNIX_TIMESTAMP обрабатывает любые входные даты как в вашем местном часовом поясе и преобразует их в метки времени UTC / GMT, то есть будет применено смещение вашего местного часового пояса, теперь, если вы обработаете временные метки возвращаются из MySQL через, например. php date () снова применит ваше местное смещение часового пояса (обратите внимание, что есть также gmtime (), который этого не делает), что приведет к нежелательным результатам.
Но вы можете обойтись этим следующим трюком, который вычтет ваш часовой пояс сеанса до того, как UNIX_TIMESTAMP () применит его, так что вы получите точное число независимо от часового пояса сервера / локального, если вы хотите точно такую же дату в дБ, как если бы это было время по Гринвичу.
mysql> SELECT UNIX_TIMESTAMP(CONVERT_TZ("2013-05-27","GMT",@@session.time_zone));
+--------------------------------------------------------------------+
| UNIX_TIMESTAMP(CONVERT_TZ("2013-05-27","GMT",@@session.time_zone)) |
+--------------------------------------------------------------------+
| 1369612800 |
+--------------------------------------------------------------------+
1 row in set (0.00 sec)
Другое решение - установить для часового пояса сервера или сеанса значение 0 (GMT), чтобы не происходило никаких реальных преобразований.