Který den je měsíc po 31.5.?

Vžijte se do následující situace: poslední den v květnu (tj. 31.5.) se dva kamarádi dohodnou, že přesně za měsíc udělají velkou párty. Kdy ta párty vlastně bude? Na rovinu říkám, že to nevím. Takže pokud máte přesnou a podloženou odpověď, sem s ní.
V návaznosti na tweet Filipa Procházky jsem se prostě musel zamyslet nad tím, jak to s tím datem vlastně je. Měl jsem už dříve vlastní názor (odvozený od toho, jak je to většinou v programování), ale pro jistotu jsem to ještě prodiskutoval s kamarádem a kolegou, Jirkou Pénzešem. No a jako na potvoru měl názor úplně jiný, čímž si tento problém získal ještě více mé pozornosti.
#PHP datetime kvíz: $d=new Datetime(‚31–5–2011‘); $d->modify(‚+1 month‘); Kolik bude echo $d->format(‚Y-m-d‘); a proč?
— Filip Procházka (@HosipLan) July 16, 2012
Můj pohled na problém
Můj přístup je možná až moc programátorský, ale beru to následovně. U data 31.5. prostě a jednoduše přičtu jedničku k měsíci, čímž vznikne mezikrok 31.6. No a jelikož červen nemá 31 dnů, ale jen 30, musím něco udělat s tím jedním dnem. A co s ním udělat jiného, než ho k danému datu (30.6.) přičíst. Získám tedy výsledek 1.7. Pro někoho možná zmatené.
Pokud stejný postup aplikuji na 31.1., mohu dostat datum buď 3.3., nebo 2.3., pokud je přestupný rok.
Jirkovo řešení
Z toho, jak jsem jeho přístup pochopil, mi vyplývá, že ten jeden den, který já jsem k datu přičetl, on prostě zahodí. Řekl bych, že je tento přístup mezi běžnými smrtelníky mnohem lépe přijímaný, než ten můj. Konkrétně tedy měsíc po 31.5. je 30.6. a měsíc po 31.1. je buď 28.2., nebo 29.2, což vypadá rozumně.
Nemohu si však odpustit vytknutí nepřesností, které takto mohou vznikat. Pokud budu brát v úvahu nepřestupný rok, bude 28.2. „přesně“ měsíc po 28.1., 29.1., 30.1. i 31.1, což mi připadá přinejmenším zvláštní.
Perfekcionistické řešení?
Pokud zabrousím trochu do programování, hodil by se podle mě způsob, kde výsledky těchto dvou kódů
<?php $date->modify('+N months');
<?php for($i=0; $i < N; $i++) { $date->modify('+1 month'); }
budou při stejném N
totožné. Jenže toho lze docílit pouze
tehdy, pokud budeme počítat s pevnou délkou měsíce. Ta by dle
jednoduchého propočtu měla být přibližně 30,4368491666666 dne.
Počítání s tímto číslem by bylo sice zatraceně otravné, běžnými
smrtelníky nepochopitelné, ale výsledek by byl vždy konstantní (až na
zaokrouhlovací chyby a zpomalování rotace Země).
-
Filip Procházka (@HosipLan)
-
Vojtěch Dobeš