Je tu zase změna zimního času na letní. Pro mnohé z nás je to nepříjemná změna v rytmu dne, ale na překvapení tento časový posun dokáže vykolejit i zkušeného programátora. Z jedné takové podzimní změny času máme s odstupem už veselou příhodu.
Pro cestovní kancelář jsme celou letní sezónu úspěšně provozovali jejich nový web, na kterém je u každého zájezdu uveden den odjezdu a den příjezdu. Na webu je zobrazena i délka zájezdu a podle ní jsou zájezdy také rozděleny (4, 7, 10 a 14 nocí). Všechno krásně celou letní sezónu fungovalo, až do října nám klient nahlásil chybu - na webu měly některé zájezdy zobrazenou délku 3,958333 noci resp. 6,958333 noci. Namísto správných 4 nocí, resp. 7 nocí.
Samozřejmě jsme to jednoduchým zaokrouhlením opravili hned. Ale nedalo nám to a chtěli jsme zjistit, proč nám to najednou počítá špatně. Dlouho jsme hledali, kde jsme udělali chybu při rozdílu dvou datumů, které se v PHP počítají jako sekundy od roku 1970, že nám to náhle na pár zájezdech zobrazuje divné počty nocí.
Jak už asi tušíte, problém byl v tom, že mezi začátkem a koncem zájezdu byl den, kdy se posouval čas, a ten "měl" 25 hodin, což je o 3600 sekund více, a tím pádem rozdíl mezi daty dělený 24*60*60 vyšel "divně" - jako uvedené počty nocí.
Správné řešení je použít při výpočtu funkci strtotime() ve formátu strtotime("+1 day") namísto počítání pomocí 24*60*60 sekund.
Takto napsané to vypadá jednoduše, ale v dané chvíli to byl tvrdý oříšek. Někdy dávno, když jsme posuny času na počítačích nastavovali ještě manuálně sami, by nás to možná napadlo dříve.
Máte podobnou příhodu s posunem času a programováním? Sem s ní...
Pro cestovní kancelář jsme celou letní sezónu úspěšně provozovali jejich nový web, na kterém je u každého zájezdu uveden den odjezdu a den příjezdu. Na webu je zobrazena i délka zájezdu a podle ní jsou zájezdy také rozděleny (4, 7, 10 a 14 nocí). Všechno krásně celou letní sezónu fungovalo, až do října nám klient nahlásil chybu - na webu měly některé zájezdy zobrazenou délku 3,958333 noci resp. 6,958333 noci. Namísto správných 4 nocí, resp. 7 nocí.
Samozřejmě jsme to jednoduchým zaokrouhlením opravili hned. Ale nedalo nám to a chtěli jsme zjistit, proč nám to najednou počítá špatně. Dlouho jsme hledali, kde jsme udělali chybu při rozdílu dvou datumů, které se v PHP počítají jako sekundy od roku 1970, že nám to náhle na pár zájezdech zobrazuje divné počty nocí.
Jak už asi tušíte, problém byl v tom, že mezi začátkem a koncem zájezdu byl den, kdy se posouval čas, a ten "měl" 25 hodin, což je o 3600 sekund více, a tím pádem rozdíl mezi daty dělený 24*60*60 vyšel "divně" - jako uvedené počty nocí.
Správné řešení je použít při výpočtu funkci strtotime() ve formátu strtotime("+1 day") namísto počítání pomocí 24*60*60 sekund.
Takto napsané to vypadá jednoduše, ale v dané chvíli to byl tvrdý oříšek. Někdy dávno, když jsme posuny času na počítačích nastavovali ještě manuálně sami, by nás to možná napadlo dříve.
Máte podobnou příhodu s posunem času a programováním? Sem s ní...