Mysql
 sql >> база данни >  >> RDS >> Mysql

Използване на часови зони в уеб приложение на PHP

Справих се подробно с тази ситуация в PHP/MySQL приложение, което написах за оператор на частен самолет преди малко повече от година. Има различни стратегии за работа с часовите зони в тези две платформи, но ще обясня как го направих. Зададох MySQL сървъра на UTC и стартирах всеки PHP скрипт в часовата зона, която потребителят посочва по време на процеса на регистрация за потребителския профил.

MySQL и PHP (PHP 5.2 и по-нови) имат собствени типове данни за дата и време. Datetime на MySQL е примитивен тип данни, докато PHP 5.2 и по-нова версия предлага вградения Клас DateTime . Типът данни за дата и време на MySQL не включва метаданни за часовата зона, но PHP обект DateTime винаги включва часова зона. Ако PHP конструкторът datetime не посочва незадължителната часова зона във втория аргумент, тогава конструкторът на PHP datetime използва променливата на средата php.

И MySQL, и PHP имат зададена часова зона по подразбиране в конфигурационните файлове. MySQL използва дата и час, зададен в конфигурационния файл за всяка db връзка, освен ако потребителят не посочи различна часова зона след стартиране на връзката с командата SET time_zone = [timezone]; . PHP също така задава променлива на средата на часовата зона за всеки скрипт, като използва часовата зона, зададена в конфигурационния файл на сървъра, и тази променлива на средата може да бъде отменена с помощта на функцията PHP date_default_timezone_set() след стартиране на скрипта.

PHP класът DateTime има свойство, наречено timezone , което е PHP DateTimeZone обект . Обектът DateTimeZone се посочва с помощта на низ за точната часова зона. списъкът с часови зони е изчерпателен, като има стотици отделни часови зони по целия свят. Часовите зони на PHP автоматично ще отчитат лятното часово време.

Когато потребителят генерира datetime в уеб приложението, конструирайте PHP обект datetime в часовата зона на потребителския профил. След това използвайте setTimezone метод за промяна на обекта DateTime към часовата зона UTC. Сега имате датата и часа на потребителя в UTC и можете да съхранявате стойността в базата данни. Използвайте DateTime format метод за изразяване на данните като низ във формат, приет от MySQL.

Така потребителят генерира datetime, а вие създавате PHP обект datetime в определената от потребителя часова зона:

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

Когато извлечете стойността от базата данни, конструирайте в UTC и след това преобразувайте в часовата зона на потребителя.

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

Използвайки този метод, вашите стойности за дата и час винаги се съхраняват в UTC вътре в db и потребителят винаги изживява стойностите в часовата зона на своя профил. PHP ще коригира лятното часово време, ако е необходимо за всяка часова зона.

Един проблем:Това обяснение не обхваща типа данни на MySQL timestamp. Препоръчвам да използвате MySQL datetime datetype за съхраняване на стойности за дата и час, а не типа данни за времеви печат. Типът данни за времеви отпечатък е обхванат в ръководството тук .

Редактиране: Можете да създадете масив, съдържащ всеки низ от часовата зона на PHP, като използвате listIdentifiers , който е статичен метод на класа DateTimeZone.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql - Автоматично актуализиране на събития в друга таблица

  2. Експортирайте и импортирайте всички MySQL бази данни наведнъж

  3. Използване на sqlalchemy за заявка с помощта на множество колони където в клауза

  4. преди вмъкване на тригер за вмъкване на дублиращи се редове в друга таблица

  5. MySQL тип данни INT(11) докато UNSIGNED INT(10)?