GoDaddyやNetworkSolutionsなどの標準の共有ホスティングパッケージを使用している私たちにとって、ホスティングサーバー(PHP)とMySQLサーバーが異なるタイムゾーンにある場合、日時変換をどのように処理しますか?
また、サイトへの訪問者がどのタイムゾーンにいるかを判断し、日時変数を適切に操作するためのベストプラクティスのアドバイスはありますか?
PHP 5.1.0以降では、 date_default_timezone_set()関数を使用して、スクリプト内のすべての日付/時刻関数で使用されるデフォルトのタイムゾーンを設定できます。
MySql の場合 ( MySQL Server Time Zone Supportページから引用)
MySQL 4.1.3 より前では、サーバーは起動時に設定されたシステム タイム ゾーンでのみ動作します。MySQL 4.1.3 から、サーバーはいくつかのタイム ゾーン設定を維持し、そのうちのいくつかは実行時に変更できます。
興味深いのは、スクリプトの最初に使用するタイム ゾーンの接続ごとの設定です。
SET timezone = 'Europe/London';
クライアントのタイムゾーン設定の検出に関しては、JavaScript を少し使用してその情報を取得して Cookie に保存し、それを後続のページ読み取りで使用して、適切なタイムゾーンを計算することができます。
//Returns the offset (time difference) between Greenwich Mean Time (GMT)
//and local time of Date object, in minutes.
var offset = new Date().getTimezoneOffset();
document.cookie = 'timezoneOffset=' + escape(offset);
または、タイム ゾーンを自分で設定するためのオプションをユーザーに提供することもできます。
RE Željko Živković からの回答です。'Europe/London' のようなタイムゾーン記述子は、mySQL 管理者がタイムゾーン テーブルをシステムに追加し、それらを更新している場合にのみ機能します。
そうしないと、「-4:00」などの数値オフセットに制限されます。幸いなことに、php の date('P') 形式で提供されます (5.1.3 以降)。
たとえば、アプリの構成ファイルを持っている可能性があります
define('TZ', 'US/Pacific');
....
if (defined('TZ') && function_exists('date_default_timezone_set')) {
date_default_timezone_set(TZ);
$mdb2->exec("SET SESSION time_zone = " . $mdb2->quote(date('P')));
}
これは、PHP と mySQL が使用するタイムゾーン オフセットについて合意することを意味します。
時間値の保存には常に TIMESTAMP を使用してください。列は実際には UNIX_TIME (エポック) として格納されますが、書き込み時には現在の time_zone オフセットから暗黙的に変換され、読み取り時には元に戻されます。
他のタイム ゾーンのユーザーの時刻を表示する場合は、グローバルな define() の代わりに、上記で特定のタイム ゾーンを設定します。TIMESTAMP 値は、アプリが結果セットを確認するまでに、mySQL によって自動的に変換されます (これは、イベントの元のタイムゾーンも実際に知る必要がある場合、別の列にある必要がある場合に問題になることがあります)。
そして、「すべての時間を int として保存しない理由」に関する限り、日付を比較して検証する機能が失われ、アプリ レベルで常に日付表現に変換する必要があることを意味します (そして、あなたはデータを直接見ています - クイック、1254369600 で何が起こったのですか?)
以前に dateTime タイプに問題があったため、すべての日付を bigint として保存します。time() PHP 関数の結果を保存すると、同じタイムゾーンにあると見なされます :)