Разбрах, че проблемът се дължи на time_zone
на моя MySQL сървър настройката е зададена на SYSTEM
(и моята система е Централна в САЩ). Laravel предоставя времеви печати, които вече са преобразувани в UTC, но моята база данни ги интерпретира като US Central поради time_zone
настройка. Времената всъщност се преобразуват отново вътрешно от MySQL към "реално" представяне на UTC unix времеви печат (което ще бъде неправилно, защото е изместено от часовата зона), въпреки че изглежда, че вече са UTC във всяка заявка, тъй като те също се преобразуват обратно в US Central отново за четене ( Знам правилно).
Поради това в 20:00:39 (20:00 PM) местно време моите времеви марки за Laravel UTC са 02:00:39. MySQL интерпретира тези часове като централно време в САЩ и тъй като часът е между 02:00 и 03:00 (което е, когато часовниците прескачат напред за Централно време в САЩ), часът е невалиден.
Най-доброто решение за приложение на Laravel е да принудите всяка връзка към базата данни да използва +00:00
часова зона (или каквото сте задали като часова зона на приложението в config/app.php
), така че няма да има вторично преобразуване. Това може да стане в config/database.php
:
'mysql' => [
// ...
'timezone' => '+00:00'
],
По този начин не сте на милостта на вашия сървър на база данни, ако той има конфигурирана часова зона, която е различна от вашето приложение Laravel. Другата опция е да промените time_zone
на базата данни настройка, но тогава все пак рискувате грешката да се повтори, ако някога смените хостове или трябва да изградите отново сървъра по някаква причина (и не конфигурирате правилно часовата зона отново), или да засегне други бази данни на сървъра.
Важна забележка:Тъй като всички предишни времеви отпечатъци бяха вътрешно компенсирани от MySQL от конфигурираната часова зона към UTC unix времеви печати (които отново бяха грешни, защото записите вече бяха UTC), може да се наложи да изпълните миграция на данни, за да коригирате стари времеви марки. Не съм проучвал по-нататък, защото за моето приложение няма значение дали старите времеви марки са били грешни с няколко часа.