Mysql
 sql >> база данни >  >> RDS >> Mysql

Проблеми с часовата зона с PHP и MySQL

Номерът тук е да знаете какъв тип колона date_last_active е Имам достатъчно опит с TIMESTAMP и DATETIME за да знаете, че единият превежда (и зачита) променливата на сесията time_zone на MySQL, а другият не.

mysql> SET SESSION time_zone = 'America/New_York';
Query OK, 0 rows affected (0.00 sec)

mysql> create table timetest ( dt datetime NULL, ts timestamp NOT NULL DEFAULT 0 );
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO timetest ( dt, ts ) VALUES ( UTC_TIMESTAMP(), UTC_TIMESTAMP() );
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO timetest ( dt, ts ) VALUES ( NOW(), NOW() );
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM timetest;
+---------------------+---------------------+
| dt                  | ts                  |
+---------------------+---------------------+
| 2009-06-27 17:53:51 | 2009-06-27 17:53:51 | 
| 2009-06-27 13:53:54 | 2009-06-27 13:53:54 | 
+---------------------+---------------------+
2 rows in set (0.00 sec)

mysql> set session time_zone='UTC';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM timetest;
+---------------------+---------------------+
| dt                  | ts                  |
+---------------------+---------------------+
| 2009-06-27 17:53:51 | 2009-06-27 21:53:51 | 
| 2009-06-27 13:53:54 | 2009-06-27 17:53:54 | 
+---------------------+---------------------+
2 rows in set (0.00 sec)

И така, ето какво правя:

  • Когато вмъквате в базата данни, използвайте UTC в PHP и в MySQL. В my.cnf Имам:time_zone=UTC за да избегнем проблеми в MySQL, а в PHP I date_default_timezone_set('UTC') .
  • Използвайте UTC_TIMESTAMP() вместо NOW() - единият е UTC, един използва местната (сесия) часова зона. Ако следвате първата точка по-горе, използвайте UTC_TIMESTAMP().
  • Когато избирате да се показва на потребителя, set time_zone=' местна_часова_зона ' преди да покажете нещо.
  • Ако трябва да покажете неща, след това актуализирайте, уверете се, че сте поставили в скоби обажданията си с подходящите промени в часовата зона в PHP и MySQL.

Надяваме се, че това е достатъчно, за да разберете как да подходите към това. Кажете ми, ако имате допълнителни въпроси.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Най-добрият начин за архивиране на MySQL база данни на живо

  2. MySQL Незаконен микс от съпоставяния

  3. Безопасно ли е да съхранявате дати като низ в mysql?

  4. Какво е решението за използване на динамичен SQL в съхранена процедура

  5. Защо \G в SELECT * FROM table_name\G?