sql >> Database >  >> RDS >> Mysql

Tijdzones gebruiken in een PHP-webtoepassing

Ik heb deze situatie uitgebreid behandeld in een PHP/MySQL-toepassing die ik iets meer dan een jaar geleden schreef voor een privéjetoperator. Er zijn verschillende strategieën om met tijdzones om te gaan op deze twee platforms, maar ik zal uitleggen hoe ik het heb gedaan. Ik stel de MySQL-server in op UTC en voer elk PHP-script uit in de tijdzone die de gebruiker opgeeft tijdens het aanmeldingsproces voor het gebruikersprofiel.

MySQL en PHP (PHP 5.2 en hoger) hebben beide native datetime datatypes. MySQL's datetime is een primitief datatype, terwijl PHP 5.2 en hoger de ingebouwde DateTime-les . Het datatype MySQL datetime bevat geen metadata voor de tijdzone, maar een PHP DateTime-object bevat altijd een tijdzone. Als de PHP datetime-constructor de optionele tijdzone niet specificeert in het tweede argument, dan gebruikt de PHP datetime-constructor de php-omgevingsvariabele.

Zowel MySQL als PHP hebben een standaard tijdzone ingesteld in de configuratiebestanden. MySQL gebruikt de datetime ingesteld in het configuratiebestand voor elke db-verbinding, tenzij de gebruiker een andere tijdzone opgeeft nadat de verbinding is gestart met het commando SET time_zone = [timezone]; . PHP stelt ook een tijdzone-omgevingsvariabele in voor elk script met behulp van de tijdzone die is ingesteld in het serverconfiguratiebestand, en deze omgevingsvariabele kan worden overschreven met behulp van de PHP-functie date_default_timezone_set() nadat het script is gestart.

De PHP DateTime-klasse heeft een eigenschap genaamd timezone , wat een PHP DateTimeZone-object is . Het DateTimeZone-object wordt opgegeven met een tekenreeks voor de exacte tijdzone. De lijst met tijdzones is veelomvattend, met honderden individuele tijdzones over de hele wereld. De PHP-tijdzones houden automatisch rekening met zomertijd.

Wanneer de gebruiker een datetime genereert in de web-app, maak dan een PHP datetime-object in de tijdzone van het gebruikersprofiel. Gebruik dan de setTimezone methode om het DateTime-object te wijzigen in de UTC-tijdzone. Nu hebt u de datetime van de gebruiker in UTC en kunt u de waarde in de database opslaan. Gebruik de DateTime format methode om de gegevens uit te drukken als een tekenreeks in het formaat dat wordt geaccepteerd door MySQL.

Dus de gebruiker genereert een datetime, en je maakt een PHP datetime-object in de door de gebruiker opgegeven tijdzone:

// 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')";

Wanneer u de waarde uit de database haalt, construeert u deze in UTC en converteert u deze naar de tijdzone van de gebruiker.

$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');

Met deze methode worden uw datetime-waarden altijd opgeslagen in UTC in de db, en de gebruiker ervaart de waarden altijd in de tijdzone van zijn/haar profiel. PHP corrigeert indien nodig voor zomertijd voor elke tijdzone.

Eén probleem:deze uitleg heeft geen betrekking op het MySQL-tijdstempelgegevenstype. Ik raad aan om het MySQL datetime datetype te gebruiken om datetime-waarden op te slaan, niet het timestamp-datatype. Het datatype timestamp wordt behandeld in de handleiding hier .

Bewerken: U kunt een array maken met elke PHP-tijdzonetekenreeks met listIdentifiers , wat een statische methode is van de klasse DateTimeZone.



  1. Fout 1022 - Kan niet schrijven; sleutel dupliceren in tabel

  2. PostgreSQL hoe u kunt zien welke query's zijn uitgevoerd

  3. Hoe installeer ik de Rails MySQL-adapter?

  4. Mysql:Stel het formaat van DATETIME in op 'DD-MM-YYYY UU:MM:SS' bij het maken van een tabel