PHP のタイムゾーンに関するいくつかの問題は、しばらく頭の片隅にあり、現在行っていることよりも適切な処理方法があるかどうか疑問に思っていました。
すべての問題は、データベースに保存された日付の再フォーマットに関係しています。
複数のタイムゾーン (ユーザー用) をサポートする必要があるサイトを扱う場合、保存されたタイムスタンプのタイムゾーン オフフェストを正規化するために、CURRENT_TIMESTAMP
属性またはNOW()
関数を使用して常にサーバーのタイムゾーンと共に保存します。
この方法では、タイムスタンプが入力されたときに PHP に設定されたタイムゾーンを考慮する必要がありません (PHP の時間関数はタイムゾーンに対応しているため)。ユーザーごとに、彼の好みに応じて、次を使用してブートストラップファイルのどこかにタイムゾーンを設定しました。
date_default_timezone_set($timezone);
phpdate()
関数を使用して日付をフォーマットしようとしている場合、MySQL は現在タイムスタンプを format で保存しているため、何らかの形式の変換を行う必要がありますY-m-d H:i:s
。タイムゾーンに関係なく、次のように実行できます。
$date = date($format,strtotime($dbTimestamp));
これに関する問題は、date()
とstrtotime()
が両方ともタイムゾーンを認識する関数であることです。つまり、PHP のタイムゾーンがサーバーのタイムゾーンとは異なるように設定されている場合、タイムゾーン オフセットが 2 回適用されます (希望する 1 回ではなく)。
これに対処するために、私は通常、UNIX_TIMESTAMP()
タイムゾーンを認識しない関数を使用して MySQL タイムスタンプを取得し、date()
直接適用できるようにします。これにより、タイムゾーン オフセットを 1 回だけ適用します。
通常のようにこれらの列を取得できなくなったり、*
すべての列をフェッチするために使用したりできないため、この「ハック」はあまり好きではありません (クエリが大幅に簡素化される場合があります)。また、使用するオプションではない場合もありますUNIX_TIMESTAMP()
(特に、クエリ構成の抽象化があまりないオープンソース パッケージで使用する場合)。
別の問題は、CURRENT_TIMESTAMP
またはの使用がNOW()
オプションではない場合にタイムスタンプを保存するときです-PHPで生成されたタイムスタンプを保存すると、回避したいタイムゾーンオフセットで保存されます。
私はおそらくここで本当に基本的な何かを見逃していますが、これまでのところ、これらの問題を処理するための一般的な解決策を考え出すことができなかったので、ケースバイケースで扱うことを余儀なくされています. あなたの考えは大歓迎です