З посібника ( розділ 9.6 ):
Поточні значення глобального та конкретного для клієнта часових поясів можна отримати так:
mysql> SELECT @@global.time_zone, @@session.time_zone;
Редагувати наведене вище повертається, SYSTEM
якщо MySQL налаштовано на підлеглий часовому поясу системи, що є менш ніж корисним. Так як ви використовуєте PHP, якщо відповідь від MySQL це SYSTEM
, ви можете попросити систему , що часовий пояс це , використовуючи з допомогою date_default_timezone_get
. (Звичайно, як VolkerK зазначив, PHP може бути запущений на іншому сервері, але припущення йдуть, припускаючи , веб - сервер і сервер БД він розмовляє будуть встановлені в [якщо на самому ділі не в ] той же часовий пояс не є величезний стрибок.) Але будьте обережні, що (як і в MySQL), ви можете встановити часовий пояс, який використовує PHP (date_default_timezone_set
), що означає, що він може повідомити про інше значення, ніж використовує ОС. Якщо ви керуєте кодом PHP, ви повинні знати, чи робите ви це, і будьте добре.
Але весь питання про те, який часовий пояс використовує сервер MySQL, може бути дотичним, оскільки запитання сервера, в якому часовому поясі він знаходиться, не дає абсолютно нічого про дані в базі даних. Детальніше читайте далі:
Подальше обговорення :
Якщо ви керуєте сервером, звичайно, ви можете переконатися, що часовий пояс є відомою кількістю. Якщо ви не контролюєте сервер, ви можете встановити часовий пояс, який використовується вашим з'єднанням, таким чином:
set time_zone = '+00:00';
Це встановлює часовий пояс на GMT, так що будь-які подальші операції (як-от now()
) використовуватиме GMT.
Зауважте, що значення часу та дати не зберігаються з інформацією про часовий пояс у MySQL:
mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)
mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 | <== Note, no change!
+---------------------+
1 row in set (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 08:32:38 | <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)
Так , знаючи , часовий пояс сервера має значення тільки з точки зору функцій , які отримують час , прямо зараз, наприклад now()
, unix_timestamp()
і т.д.; він нічого не говорить про те, в якому часовому поясі використовуються дати в даних бази даних. Ви можете припустити, що вони написані за допомогою часового поясу сервера, але це припущення може бути помилковим. Щоб знати часовий пояс будь-яких дат або часу, збережених у даних, ви повинні переконатися, що вони зберігаються з інформацією про часовий пояс або (як я це роблю), щоб вони завжди перебували в GMT.
Чому припускаємо, що дані були записані за допомогою помилок часового поясу сервера? Ну, для одного, дані, можливо, були записані за допомогою з'єднання, яке встановило інший часовий пояс. База даних, можливо, була перенесена з одного сервера на інший, де сервери були в різних часових поясах (я наткнувся на це, коли я успадкував базу даних, яка переїхала з Техасу в Каліфорнію). Але навіть якщо дані записані на сервері, з його поточним часовим поясом, це все одно неоднозначно. Минулого року у Сполучених Штатах 1 листопада 1 години ранку було відключено літній час. Припустимо, мій сервер знаходиться в Каліфорнії, використовуючи тихоокеанський часовий пояс, і я маю значення2009-11-01 01:30:00
в базі даних. Коли це було? Це був 1:30 ранку 1 листопада PDT або 1:30 ранку 1 листопада PST (через годину)? У вас немає абсолютно ніякого способу знати. Мораль: Завжди зберігайте дати / часи в GMT (що не робить DST) та конвертуйте у потрібний часовий пояс у міру необхідності.