Posun času a zájazd na 6,958333 nocí

Je tu znovu zmena zimného času na letný. Pre mnohých z nás je to nepríjemná zmena v rytme dňa, no napodiv tento časový posun vie vykoľajiť aj skúseného programátora. Z jednej takejto jesennej zmeny času máme s odstupom už veselú príhodu.

Pre cestovnú kanceláriu sme celú letnú sezónu úspešne prevádzkovali ich nový web, na ktorom je pri každom zájazde uvedený deň odchodu a deň príchodu. Na webe je zobrazená aj dĺžka zájazdu a podľa nej sú zájazdy aj rozdelené (4, 7, 10 a 14 nocí).  Všetko krásne celú letnú sezónu fungovalo, až kým v októbri nám klient nenahlásil chybu - na webe mali niektoré zájazdy zobrazenú dĺžku 3,958333 nocí resp. 6,958333 nocí. Namiesto správnych 4 noci, resp. 7 nocí.

Samozrejme sme to jednoduchým zaokrúhlením napravili hneď. No nedalo nám to a chceli sme zistiť, prečo nám to zrazu počíta zle. Dlho sme hľadali, kde sme spravili chybu pri rozdiele dvoch dátumov, ktoré sa v PHP počítajú ako sekundy od roku 1970, že nám to znenazdajky na pár zájazdoch zobrazuje čudné počty nocí.

Ako už zrejme tušíte, problém bol v tom, že medzi začiatkom a koncom zájazdu bol deň, kedy sa posúval čas, a ten “mal” 25 hodín, čo je o 3600 sekúnd viac, a tým pádom rozdiel medzi dátumami delený 24*60*60 vyšiel “čudne” - ako uvedené počty nocí.

Správne riešenie je použiť pri výpočte funkciu strtotime() vo formáte strtotime("+1 day") namiesto počítania pomocou 24*60*60 sekúnd. 

Takto napísané to vyzerá jednoducho, no v danej chvíli to bol tvrdý oriešok. Voľakedy dávno, keď sme posuny času na počítačoch nastavovali ešte manuálne sami, by nás to možno napadlo skôr.

Máte podobnú príhodu s posunom času a programovaním? Sem s ňou...