MySQLのDATEタイプとDATETIMEタイプに制限する場合は、MySQL自体のタイムゾーンの問題をほとんど無視できます。 MySQLのTIMESTAMPタイプを避けたい理由は、次のとおりです。
DATETIME値の読み取り/書き込みに関しては、入力した内容が正確に返されます。これは良いことです。
そのため、データベースにUTC値を書き込んでいることを常に確認するという問題が残ります。
PHPがUTCを使用していることを確認する最良の方法は、 date_default_timezone_set()
。これにより、date('Y-m-d H:i:s')
のような呼び出しが確実に行われます UTC値が表示されます。また、(new \DateTime('now'))->getTimezone()
のようなものが確実になります UTC\DateTimeZoneインスタンスを返します。
もちろん、ユーザーから取得した日付/時刻の値を保存する場合は、事態が大幅に難しくなることに注意してください。このような場合、値を永続化する前に、ユーザーがどのタイムゾーンにいるかを何らかの方法で判断し、UTCへの変換を処理する必要があります。ユーザーがユーザーごとのタイムゾーン設定を持っていると仮定すると、基本的に次のようになります。
/** @var \DateTimeZone $userTZ */
$userTz = getUserTimezone();
$dateTime = new \DateTime($user_submitted_date_string, $userTz);
$dateTime->setTimezone(new \DateTime('UTC'));
$dateTimeStr = $dateTime->format('Y-m-d H:i:s');