Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Zeitzonenprobleme mit PHP und MySQL

Der Trick dabei ist zu wissen, welcher Spaltentyp date_last_active ist ist. Ich habe genug Erfahrung mit TIMESTAMP und DATETIME um zu wissen, dass die eine die MySQL-Sitzungsvariable time_zone übersetzt (und berücksichtigt), die andere nicht.

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)

Also, hier ist, was ich mache:

  • Verwenden Sie beim Einfügen in die Datenbank UTC in PHP und in MySQL. In my.cnf Ich habe:time_zone=UTC um Probleme in MySQL zu vermeiden, und in PHP I date_default_timezone_set('UTC') .
  • Verwenden Sie UTC_TIMESTAMP() statt NOW() - eine ist UTC, eine verwendet die lokale (Sitzungs-) Zeitzone. Wenn Sie dem ersten Punkt oben folgen, verwenden Sie UTC_TIMESTAMP().
  • Wenn Sie sich für die Anzeige für den Benutzer entscheiden, set time_zone=' local_time_zone ' bevor etwas angezeigt wird.
  • Wenn Sie Sachen anzeigen müssen, dann aktualisieren Sie, achten Sie darauf, Ihre Aufrufe mit den entsprechenden Zeitzonenänderungen in PHP und MySQL einzuklammern.

Hoffentlich reicht das aus, um herauszufinden, wie man das angeht. Lassen Sie mich wissen, wenn Sie weitere Fragen haben.