タイムゾーンを処理するには、次の2つの鍵があります。
すべての日付/時刻を同じタイムゾーンに保存します(任意のタイムゾーンにすることができますが、UTCを使用すると作業が簡素化されます)。
アプリケーションの日付/時刻をストレージタイムゾーンからユーザー表示タイムゾーンに変換する場所を決定します。これは、データベース抽象化レイヤー、アプリケーションコード、またはページテンプレート(基本的にMVCスタックの任意の部分)で実行できます。重要なことは一貫性を保つことです。
また、phpにはMySQLとは独立した独自のタイムゾーン設定があることを忘れないでください。php> 5.1を実行している場合は、date_set_default_timezone()を使用して実行時にphpタイムゾーンを変更できます。
データベースに情報を取得/保存するときにタイムゾーン変換を行うことにした場合、MySQLのconvert_tz()関数が新しい親友になります。
私にとっては、ページテンプレートの一部としてタイムゾーン変換を行うのが最も簡単でした。日付/時刻はUTCタイムゾーンでデータベースに保存され、すべてのアプリケーションロジックもUTCで行われます。HTMLで日付を出力するときは、phpのdate()のラッパー関数を使用して、ユーザーのタイムゾーンで日付を出力します。
function getTimezoneOffset($time, $timezone)
{
$t = new DateTime(date('Y-m-d H:i:s', $time));
$tz = new DateTimeZone($timezone);
$t->setTimeZone($tz);
return $t->getOffset();
}
function myDate($timezone, $format, $timestamp=false)
{
if (!$timestamp) $timestamp = time();
return date($format, $timestamp+getTimezoneOffset($timestamp, $timezone));
}
同様に、フォームを介してユーザーから入力を受け取る場合は、最初にタイムゾーン変換を実行して、アプリケーションでUTC日時を使用できるようにします。
もう1つのオプションは、PostgreSQLを使用することです。MySQLとは異なり、日時のタイムゾーンサポートが組み込まれています。