sql >> Database >  >> RDS >> Mysql

Tijdzoneproblemen hebben met PHP en MySQL

De truc hier is om te weten welk kolomtype date_last_active is. Ik heb genoeg ervaring met TIMESTAMP en DATETIME om te weten dat de ene de MySQL time_zone-sessievariabele vertaalt (en respecteert) en de andere niet.

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)

Dus, hier is wat ik doe:

  • Gebruik bij het invoegen in de database UTC in PHP en in MySQL. In my.cnf Ik heb:time_zone=UTC om problemen in MySQL te voorkomen, en in PHP I date_default_timezone_set('UTC') .
  • Gebruik UTC_TIMESTAMP() in plaats van NOW() - de ene is UTC, de andere gebruikt de lokale (sessie) tijdzone. Als je het eerste punt hierboven volgt, gebruik dan UTC_TIMESTAMP().
  • Bij het selecteren om weer te geven aan de gebruiker, set time_zone=' . in local_time_zone ' voordat er iets wordt weergegeven.
  • Als je dingen moet weergeven en vervolgens moet updaten, zorg er dan voor dat je je oproepen plaatst met de juiste tijdzonewijzigingen in PHP en MySQL.

Hopelijk is dat genoeg om erachter te komen hoe dit aan te pakken. Laat het me weten als je nog vragen hebt.



  1. Ruby:mysql2-Gem werkt niet (Mac OS X Snow Leopard, Ruby 1.9.2)

  2. Hoe mysql-rij te verwijderen nadat de tijd is verstreken?

  3. Unieke waarden afdwingen over twee tabellen

  4. Hoe ATAN2() werkt in MariaDB