問題はMySQLサーバーのtime_zone
が原因であることがわかりました SYSTEM
に設定されている設定 (そして私のシステムはUS Centralです)。 LaravelはすでにUTCに変換されたタイムスタンプを提供していますが、time_zone
のため、私のデータベースはそれらをUSCentralとして解釈しています。 設定。時代は実際に再び変換されています MySQLによって内部的に「実際の」UTCUNIXタイムスタンプ表現(タイムゾーンによってオフセットされているため正しくない)に変換されますが、読み取りのために再びUS Centralに変換されるため、すべてのクエリですでにUTCであるように見えます(私は正しいことを知っています。
このため、現地時間の20:00:39(8:00 PM)のLaravelUTCタイムスタンプは02:00:39です。 MySQLはこれらの時刻を米国中部標準時として解釈します。時刻は02:00から03:00(米国中部標準時の時計がスキップされる時刻)であるため、時刻は無効です。
Laravelアプリケーションの最善の解決策は、すべてのデータベース接続に+00:00
を使用させることです。 タイムゾーン(またはconfig/app.php
でアプリケーションのタイムゾーンとして設定したもの) )したがって、二次変換は発生しません。これは、config/database.php
で実行できます。 :
'mysql' => [
// ...
'timezone' => '+00:00'
],
このように、Laravelアプリケーションとは異なるタイムゾーンが構成されている場合、データベースサーバーに翻弄されることはありません。もう1つのオプションは、データベースのtime_zone
を変更することです。 設定しますが、ホストを変更したり、何らかの理由でサーバーを再構築する必要がある場合(およびタイムゾーンを再度正しく構成しない場合)、またはサーバー上の他のデータベースに影響を与える場合は、バグが再発するリスクがあります。
重要な注意:以前のタイムスタンプはすべて、MySQLによって構成されたタイムゾーンからUTC unixタイムスタンプに内部的にオフセットされていたため(レコードはすでにUTCであったため、これも間違っていました)、データ移行を実行して修正する必要がある場合があります。古いタイムスタンプ。私のアプリケーションでは、古いタイムスタンプが数時間間違っていても問題ないため、これ以上調査していません。