sql >> Database teknologi >  >> RDS >> Mysql

Har tidszoneproblemer med PHP og MySQL

Tricket her er at vide, hvilken kolonnetype date_last_active er. Jeg har haft nok erfaring med TIMESTAMP og DATETIME at vide, at den ene oversætter (og respekterer) sessionsvariablen MySQL time_zone, den anden gør det ikke.

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)

Så her er hvad jeg gør:

  • Når du indsætter i databasen, skal du bruge UTC i PHP og i MySQL. I my.cnf Jeg har:time_zone=UTC for at undgå problemer i MySQL og i PHP I date_default_timezone_set('UTC') .
  • Brug UTC_TIMESTAMP() i stedet for NOW() - en er UTC, en bruger den lokale (session) tidszone. Hvis du følger det første punkt ovenfor, skal du bruge UTC_TIMESTAMP().
  • Når du vælger at vise til brugeren, set time_zone=' lokal_tidszone ' før du viser noget.
  • Hvis du skal vise ting, så opdater, sørg for at sætte dine opkald i parentes med de relevante tidszoneændringer i PHP og MySQL.

Forhåbentlig er det nok til at finde ud af, hvordan man griber dette an. Sig til, hvis du har yderligere spørgsmål.



  1. SQLite MELLEM

  2. Hvordan kan jeg overføre en række værdier til min lagrede procedure?

  3. Sådan rettes fejlmeddelelse 7325 i SQL Server:"Objekter, der afslører kolonner med CLR-typer, er ikke tilladt i distribuerede forespørgsler"

  4. CentOs Php og MySql-konfiguration