Jeg fandt ud af, at problemet skyldtes min MySQL-servers time_zone
indstilling indstilles til SYSTEM
(og mit system er US Central). Laravel leverer tidsstempler, der allerede var konverteret til UTC, men min database tolker dem som US Central på grund af time_zone
indstilling. Tiderne bliver faktisk konverteret igen internt af MySQL til en "rigtig" UTC unix tidsstempelrepræsentation (som vil være forkert, fordi den er forskudt af tidszonen), selvom de ser ud til at være UTC allerede i hver forespørgsel, fordi de også bliver konverteret tilbage til US Central igen til læsning ( Jeg ved ret).
På grund af dette er mine Laravel UTC-tidsstempler kl. 20:00:39 (8:00 PM) lokal tid 02:00:39. MySQL fortolker disse tider som amerikansk centraltid, og fordi tiden er mellem 02:00 og 03:00 (hvilket er når urene springer fremad for US Central), er tiden ugyldig.
Den bedste løsning til en Laravel-applikation er at tvinge enhver databaseforbindelse til at bruge en +00:00
tidszone (eller hvad du nu har indstillet som applikationens tidszone i config/app.php
), så der vil ikke ske en sekundær konvertering. Dette kan gøres i config/database.php
:
'mysql' => [
// ...
'timezone' => '+00:00'
],
På denne måde er du ikke prisgivet din databaseserver, hvis den har en konfigureret tidszone, der er forskellig fra din Laravel-applikation. Den anden mulighed er at ændre databasens time_zone
indstilling, men så risikerer du stadig, at fejlen gentager sig, hvis du nogensinde skifter vært eller har brug for at genopbygge serveren af en eller anden grund (og ikke konfigurerer tidszonen korrekt igen), eller påvirker andre databaser på serveren.
Vigtig bemærkning:Da alle de tidligere tidsstempler blev forskudt internt af MySQL fra den konfigurerede tidszone til UTC unix-tidsstempler (som igen var forkerte, fordi registreringerne allerede var UTC), kan det være nødvendigt at køre en datamigrering for at rette gamle tidsstempler. Jeg har ikke undersøgt yderligere, for for min ansøgning er det ligegyldigt, om de gamle tidsstempler var forkerte med et par timer.