Nepříliš chytrý blog Od programování po jezevce

16Čvc/122
Programování

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

datum

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.

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,4368491666­666 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)

    Pěkné :) Související diskuze: https://www.facebook.com/…954133745147

  • Vojtěch Dobeš

    Podle mě jsou strašně vzácné situace, kdy je skutečně třeba přičítat měsíc… ti dva kamarádi si podle mě řeknou „za měsíc“ a potom si hned řeknou „tak kdy přesně“. V naprosté většině jde podle mě o „tenhle den“ příští měsíc… buď podle data, nebo i podle umístění v rámci týdne. Zajímaly by mne příklady, kdy jde skutečně o tu „vzdálenost měsíce“, namísto „za měsíc zase stejně“.