私はこの状況に、1年ちょっと前にプライベートジェットオペレーターのために書いたPHP/MySQLアプリケーションで広範囲に対処しました。これら2つのプラットフォームでタイムゾーンを処理するためのさまざまな戦略がありますが、私がそれをどのように行ったかを説明します。 MySQLサーバーをUTCに設定し、ユーザープロファイルのサインアッププロセス中にユーザーが指定したタイムゾーンで各PHPスクリプトを実行します。
MySQLとPHP(PHP 5.2以降)はどちらもネイティブの日時データ型を持っています。 MySQLの日時はプリミティブデータ型ですが、PHP5.2以降では組み込みの
MySQLとPHPの両方で、構成ファイルにデフォルトのタイムゾーンが設定されています。 MySQLは、構成ファイルで設定された日時を使用します。 a> コマンドSET time_zone = [timezone];
を使用して接続を開始した後、ユーザーが異なるタイムゾーンを指定しない限り、データベース接続ごとに 。 PHPは、サーバー構成ファイルで設定されたタイムゾーンを使用して各スクリプトのタイムゾーン環境変数も設定します。この環境変数は、PHP関数 date_default_timezone_set()
スクリプトの開始後。
PHPのDateTimeクラスには、 timezoneというプロパティがあります。 、これはPHPDateTimeZoneオブジェクト です。 。 DateTimeZoneオブジェクトは、正確なタイムゾーンの文字列を使用して指定されます。 タイムゾーンのリスト 包括的であり、世界中に数百の個別のタイムゾーンがあります。 PHPのタイムゾーンは、夏時間を自動的に考慮します。
ユーザーがWebアプリで日時を生成するときに、ユーザーのプロファイルのタイムゾーンでPHP日時オブジェクトを作成します。次に、 setTimezone
を使用します。
DateTimeオブジェクトをUTCタイムゾーンに変更するメソッド。これで、UTCでのユーザーの日時がわかり、値をデータベースに保存できます。 DateTime format
を使用します
MySQLで受け入れられる形式の文字列としてデータを表現するメソッド。
したがって、ユーザーは日時を生成し、ユーザーが指定したタイムゾーンでPHP日時オブジェクトを作成します。
// 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に保存され、ユーザーは常に自分のプロファイルのタイムゾーンの値を経験します。 PHPは、必要に応じてタイムゾーンごとに夏時間を修正します。
1つの落とし穴:この説明は、MySQLタイムスタンプデータ型をカバーしていません。タイムスタンプデータ型ではなく、MySQL日時日付型を使用して日時値を格納することをお勧めします。タイムスタンプのデータ型については、マニュアルのこちら で説明されています。 。
編集: listIdentifiers を使用して、すべてのPHPタイムゾーン文字列を含む配列を作成できます。 、これはDateTimeZoneクラスの静的メソッドです。