Obliczenia na dacie

Na studiach informatycznych i innych związanych z programowaniem zwykle pojawia się ten koszmarny przykład: obliczenie różnicy pomiędzy dwoma datami. Dlaczego koszmarny? Bo zakłada się przy tym, że „koń i woźnica mają średnio po 3 nogi”. Słyszałem o przypadku w stylu „miesiąc ma 30 a rok 370 dni”.

Zasady gry

Celem jest podanie ilości lat, miesięcy i dni jakie upłynęły między dwoma wydarzeniami. W implementacjach użyję języka JavaScript, ponieważ blog miał być związany z technologiami internetowymi. Mam nadzieję, że kod będzie czytelny dla osób uczących się podstaw programowania w C/C++. Nie chcę też dawać możliwości użycia go na zasadzie kopiuj-wklej.

Struktura danych

Programy składają się nie tylko z algorytmów, ale i struktur danych. Tu pojawia się pierwszy problem. Wbudowane typy nie nadają się do takich obliczeń. Tak jak w przypadku C/C++ typy zmiennych w strukturze time_t, w JavaScript sposób działania metod obiektu Date bardzo utrudnia operacje matematyczne. W swoich programach użyłem własnej klasy Tm, zawierającej 3 publiczne pola: rok, miesiąc i dzień. Kompletną implementację można pobrać na końcu wpisu.

Tm = {
	year: {number},
	month: {number},
	day: {number}
}

 

Implementacja

Zobacz CodePen yeyxWP autorstwa Tymoteusza (@Tymek) na CodePen.io.

 

Problemy z naszym kalendarzem

Program zadziała jedynie współczesnego kalendarza, więc może być niedokładny (przez datę zmiany kalendarza w Rosji) nawet dla obliczania wieku wciąż żyjących osób, a co dopiero wydarzeń historycznych!

Dało by się uprościć obliczenia? Oczywiście! Znów zmieńmy kalendarz. Brzmi jak szalony pomysł, ale Kalendarz Światowy ma swoich zwolenników. Do propozycji którą znalazłem mam kilka zastrzeżeń. Po pierwsze, sądząc po stronie internetowej organizacji, chyba nikt aktualnie nie zajmuje się tą inicjatywą. Po drugie, „Worldsday” brzmi trochę jak „New World Order”, a po trzecie i najważniejsze, kto zgodzi się na piątek trzynastego 4 razy w roku! 😛

Kalendarz nie jest jedynym problemem w naszym mierzeniu czasu. Polecam dziesięciominutowy filmik: The Problem with Time & Timezones – Computerphile.

 

Zakończenie

Obliczanie różnicy między datami jest dla Ciebie za łatwe? Szukasz wyzwań?

<MDW> Santon: Algorytm obliczania daty tłustego czwartku jest bardziej skomplikowany niż algorytm kompresji JPEG 🙂
bash.org.pl/4859546/

Kompresję JPEG znam tylko w założeniach, a jeśli chodzi o algorytm obliczania daty tłustego czwartku, wziąłem lekcję z załączonego wcześniej filmu. Zmodyfikowałem gotową implementację.

Dziękuję za uwagę. W następnym materiale postaram się napisać coś bez kodu źródłowego, podejmując temat wizualnego projektowania stron internetowych.