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

Brug af tidszoner i en PHP-webapplikation

Jeg beskæftigede mig udførligt med denne situation i en PHP/MySQL-applikation, jeg skrev til en privat jetoperatør for lidt over et år siden. Der er forskellige strategier til at håndtere tidszoner på disse to platforme, men jeg vil forklare, hvordan jeg gjorde det. Jeg indstiller MySQL-serveren til UTC og kører hvert PHP-script i den tidszone, som brugeren angiver under tilmeldingsprocessen for brugerprofilen.

MySQL og PHP (PHP 5.2 og nyere) har begge native datetime-datatyper. MySQL's datetime er en primitiv datatype, mens PHP 5.2 og nyere tilbyder den indbyggede DateTime-klasse . MySQL datetime-datatypen inkluderer ikke metadata for tidszonen, men et PHP DateTime-objekt inkluderer altid en tidszone. Hvis PHP datetime-konstruktøren ikke angiver den valgfrie tidszone i det andet argument, så bruger PHP-datetime-konstruktøren php-miljøvariablen.

Både MySQL og PHP har standardtidszone indstillet i konfigurationsfilerne. MySQL bruger datoklokkeslæt angivet i konfigurationsfilen for hver db-forbindelse, medmindre brugeren angiver en anden tidszone, efter at forbindelsen er startet med kommandoen SET time_zone = [timezone]; . PHP indstiller også en tidszone miljøvariabel for hvert script ved hjælp af tidszonen indstillet i serverens konfigurationsfil, og denne miljøvariabel kan tilsidesættes ved hjælp af PHP-funktionen date_default_timezone_set() efter at scriptet starter.

PHP DateTime-klassen har en egenskab kaldet tidszone , som er et PHP DateTimeZone-objekt . DateTimeZone-objektet er angivet ved hjælp af en streng for den nøjagtige tidszone. listen over tidszoner er omfattende og har hundredvis af individuelle tidszoner over hele verden. PHP-tidszonerne vil automatisk tage højde for sommertid.

Når brugeren genererer en datetime i webappen, skal du konstruere et PHP datetime-objekt i tidszonen for brugerens profil. Brug derefter setTimezone metode til at ændre DateTime-objektet til UTC-tidszonen. Nu har du brugerens datetime i UTC, og du kan gemme værdien i databasen. Brug DateTime format metode til at udtrykke dataene som en streng i det format, der accepteres af MySQL.

Så brugeren genererer et datetime, og du laver et PHP datetime objekt i brugerens specificerede tidszone:

// set using an include file for user profile
$user_timezone = new DateTimeZone('America/New_York'); 

// 1st arg in format accepted by PHP strtotime
$date_object1 = new DateTime('8/9/2012 5:19 PM', $user_timezone); 
$date_object1->setTimezone(new DateTimeZone('UTC'));
$formated_string = $date_object1->format('Y-m-d H:i:s');
$query_string = "INSERT INTO `t_table1` (`datetime1`) VALUES('$formated_string')";

Når du henter værdien fra databasen, skal du konstruere i UTC og derefter konvertere til brugerens tidszone.

$query_string = "SELECT `datetime1` FROM `t_table1`";
$date_object1 = new DateTime($datetime_string_from_mysql, new DateTimeZone('UTC'));
$date_object1->setTimezone($user_timezone);
$string_for_display_in_application = $date_object1->format('m/d/Y g:i a');

Ved at bruge denne metode bliver dine datetime-værdier altid gemt i UTC inde i db'en, og brugeren oplever altid værdierne i sin profils tidszone. PHP vil korrigere for sommertid, hvis det er nødvendigt for hver tidszone.

One gotcha:Denne forklaring dækker ikke MySQL-tidsstempeldatatypen. Jeg anbefaler at bruge MySQL datetime datotype til at gemme datetime værdier, ikke tidsstemplet datatype. Tidsstemplets datatype er dækket i manualen her .

Rediger: Du kan producere et array, der indeholder hver PHP-tidszonestreng ved hjælp af listIdentifiers , som er en statisk metode af DateTimeZone-klassen.



  1. varchar(255) vs tinytext/tinyblob og varchar(65535) vs blob/text

  2. Prisen for ikke at rense

  3. Eksempel på Oracle IF-tilstand

  4. Hvad er forskellen mellem Non-Repeatable Read og Phantom Read?