Snadnější data s AimDate

Po přečtení jednoho dílu z výuky JavaScriptu, konkrétně „Výuka JavaScriptu – 8.“ jsem se rozhodl zveřejnit svůj volně dostupný objekt pracující vhodněji s datem. Na rozdíl od objektu Date má snazší použitelnost, správně počítá s přestupnými roky a nemate uživatele požadavky na parametry.
Pokud chceme lépe pracovat s datem a zjistit třeba i něco navíc, může být použití objektu Date nepohodlné. Nepřesnosti způsobené jeho ne-počítáním s přestupnými roky potom značně omezují jeho obecnou použitelnost. Z tohoto důvodu jsem tedy vyrobil vlastní objekt, AimDate, který jsem "naučil" správně a efektivně pracovat s daty.

V osmém dílu seriálu „Výuka JavaScriptu“ jste se mohli naučit používat objekt Date, mohli jste ale také narazit na určitá úskalí:

  • např. [objekt] = new Date(88,09,12) - znamená (zcela nejasně) vytvoření data roku 1988, měsíce 10. a dne 12.
  • např. [objekt].setDate([objekt].getDate()+30) - teoreticky přičte k datumu 30 dní, avšak nepočítá ani s počty dnů v měsíci, natož s přestupným rokem
Pokud bychom si popsali konkrétní možné problémy, byly by to tyto:
  • nejasný zápis letopočtu: 88 znamená 1988 a ne například 2088
  • neprůhledný zápis měsíce: v objektu Date je číslo měsíce vždy menší o 1, než jaké číslo měsíce objekt reprezentuje Jestliže tedy metoda getMonth() vrátí 9, musíme vědět, že to znamená 10
  • metoda setDate(…) sice umožní přičíst k datu libovolné číslo, ale výsledek může být zcela chybný
  • chybí metody pro zjištění počtu dnů v měsíci nebo roce
  • chybí metoda pro zjištění čísla týdne
  • chybí zjištění přestupného roku
  • přebývá informace o čase - přece jen "Date" znamená "Datum" a ne "Datum&Čas"
Podívejme se tedy na objekt AimDate a jeho metody:

Z těchto důvodů jsem napsal v jazyce JavaScript vlastní objekt AimDate. Pro ošetření chybových vstupů jsou prohlížeči posílány chybové objekty (objekt Error). Objekt AimDate používá pouze jediný vnější objekt Math, a není proto nijak závislý na objektu Date. Objekt AimDate reprezentuje datum v Gregoriánském kalendáři, tedy takové, jaké dnes známe a běžně používáme. Je určen číselnými hodnotami roku, měsíce a dne. Přestože byl Gregoriánský kalendář zaveden až v roce 1582, rokem může být libovolné číslo, kladné, záporné či nula, použitelné v počítači. Čísla měsíců jsou v rozmezí 1 až 12. Čísla dnů jsou od 1 do počtu dnů v měsíci daného roku (rok může být přestupný) – čísla mezi 28 a 31. Názvy metod a chybových stavů jsou v angličtině (je to přece jen určitý standard), avšak názvy dnů a měsíců jsou implicitně v češtině (lze je změnit).

Ucelenou uživatelskou dokumentaci můžete najít také na mojí webové stránce, kde jsou dostupné i on-line ukázky použití objektu.

Pro použití objektu přidejte do záhlaví dokumentu:

<SCRIPT LANGUAGE="JavaScript"
SRC="http://sweb.cz/aim/bin/AimDate.js"></SCRIPT>

Nebo si skript můžete stáhnout a uložit jej k sobě. Při použití ho pak prohlížeč nebude muset hledat po síti. Do dokumentu potom stačí vložit:

<SCRIPT LANGUAGE="JavaScript“
SRC="AimDate.js"></SCRIPT>

Nový objekt AimDate pak již vytvoříte velmi snadno takto:

<script type="text/javascript">
<!--
var datum = new AimDate( 14, 2, 2002 );
//-->
</script>

Poznamenejme, že objekt je při vytvoření zabezpečen proti chybnému vstupu; tedy například žádnému, nesmyslnému (záporná čísla, ne-číselné řetězce) a také čísla větší, než je povolený rozsah pro dny a měsíce. Číselné řetězce jsou převáděny na čísla, je možné použít i proměnné.

Při chybě je buď zobrazeno okno se zprávou popisující chybu, nebo prohlížeč chybu zaznamená jinak (např. ikona a hláška "Na stránce se vyskytla chyba." ve stavovém řádku). Pokud chcete zbytečným upozorněním předejít nebo je zpracovat, použijte klauzule try … catch(Error) … Například takto si můžeme nechat vypsat konkrétní chybu do stavového řádku:

<script type="text/javascript">
<!--
try
    new AimDate("1 2","1+0",2002)
catch(Error)
    window.status=Error.description

try
    new AimDate(30,2,2002)
catch(Error)
    window.status=Error.description

//-->
</script>

Ve stavovém řádku by se postupně objevila tato upozornění:

! Error in constructor:
    the 1nd parameter (day) and
    the 2st parameter (month) are not numbers.
! Error in constructor:
    the 1st argument (day: 30) must be in
    the range of <1,28> for the month 2 and year 2002.

Pokud budete chtít získat datum, napište:

<script type="text/javascript">
<!—
// například pro 14.2.2002
var datum = new AimDate( 14, 2, 2002 );
// následují metody pro výpis
document.writeln( datum ); // volá metodu toString()
//document.writeln( datum.toString() ); // stejné jako předchozí
document.writeln( datum.toDMYString() );
document.writeln( datum.toMDYString() );
document.writeln( datum.toDDMMYString() );
document.writeln( datum.toMMDDYString() );
document.writeln( datum.toFullString() );
//-->
</script>

A jak se tyto informace zobrazí prohlížeči: 14.2.2002
14.2.2002
2/14/2002
14.02.2002
02/14/2002
čtvrtek 14. únor 2002

Na aktuální objekt můžeme použít tyto metody:

valign=top>
Metoda Význam
toString() Vrací datum ve tvaru "D.M.Y" (Day=den, Month=měsíc, Year=rok) Den, měsíc i rok mají plný počet číslic.
toDMYString() Stejné jako toString().
toMDYString Vrací datum ve tvaru "M/D/Y".
toDDMMYString() Vrací datum ve tvaru "D.M.Y" Den i měsíc předchází znak "0", pokud jsou menší než 10. Tedy pro 1.3.2000 získáme "01.03.2000".
toMMDDYString() Vrací datum ve tvaru "MM/DD/Y" Formát výsledku – viz předchozí.
isLeapYear() Vrací logickou hodnotu (true=pravda nebo false=nepravda), zda je rok přestupný.
getDaysInMonth() Vrací počet dnů v měsíci.
getDaysInYear() Vrací počet dnů v roce.
getDayNumberInYear() Vrací pořadové číslo dne v roce.
getWeek() Vrací číslo týdne.
getFirstWeekday() Vrací datum (objekt AimDate) k začátku týdne (nastaveno pondělí), ve kterém je aktuální objekt.
getDayName() Vrací název dne.
getDayNames() Vrací pole délky 7 (indexy 0 až 6), uvádějící názvy dnů (1.pondělí – 7. neděle). Pole se umí samo vypsat, stačí tedy napsat např. document.writeln(new AimDate(1,1,0).getDayNames()) a vypíše se pondělí,úterý,středa,čtvrtek,pátek,sobota,neděle
setDayNames(pondeli, utery, streda, ctvrtek ,patek, sobota, nedele) Nastaví názvy dnů dle sedmi parametrů. Parametry musí být řetězce nebo proměnné zastupující řetězce (může být použita i interpunkce). V případě, že některý parametr chybí, pošle se podrobná chybová zpráva.
getMonthName() Vrací název měsíce.
getMonthNames() Vrací pole délky 12 (indexy 0 až 11), uvádějící názvy měsíců (1.leden – 12.prosinec). Pole se umí samo vypsat.
setMonthNames(leden,…,prosinec) Nastaví názvy dnů dle dvanácti parametrů. V případě, že některý parametr chybí, pošle se podrobná chybová zpráva.
changeDays(parametr) Změní datum objektu o počet dnů daných parametrem. Hodnota parametru může být celé kladné nebo celé záporné číslo.
getDistanceTo( AimDate_objekt ) Vrátí počet dnů od aktuálního data do data parametru (parametr musí být objekt typu AimDate).
Poznámka: Při používání těchto metod je nutné názvy metod zapsat správně včetně velkých a malých písmen.

Vidíte tedy, že tento objekt umožňuje mnohem víc, než obyčejný objekt Date. Umožňuje kromě základních operací i lokalizaci názvů dnů a měsíců, bezchybné přičítání dnů a samozřejmě dbá na přestupné roky. Chcete snad po datumu ještě něco víc?

Diskuze (6) Další článek: Mozilla 0.9.8

Témata článku: Software, Programování, Error, Interpunkce, Gregoriánský kalendář, Catch, Záporné číslo, Podrobná data, Aim, Určitý objekt, Přestupný rok, Počet dnů


Určitě si přečtěte

10 mýtů a polopravd o bateriích, kterým možná ještě věříte

10 mýtů a polopravd o bateriích, kterým možná ještě věříte

** Kolem baterií a akumulátorů koluje řada mýtů, nepravd a polopravd ** Dnes vám devět z nich zkusíme vyvrátit na základě faktů ** Většina z nich totiž neplatí pro moderní lithiové baterie

Karel Kilián, David Polesný | 102

Koupili jsme nejlevnější dron s kamerou. Stál nás 300 Kč a má rozměry kreditky

Koupili jsme nejlevnější dron s kamerou. Stál nás 300 Kč a má rozměry kreditky

** Kvalitní drony začínají na 10 000 Kč ** Šli jsme na to jinak a koupili ten nejlevnější s kamerou ** I když je to čínský šmejd, je s ním zábava

Jakub Čížek | 34

České Rajče je stále plné dětských nahotin. Student pomocí A.I. analyzoval miliony fotek

České Rajče je stále plné dětských nahotin. Student pomocí A.I. analyzoval miliony fotek

** Rajče.net má odjakživa problémy s choulostivými fotkami dětí ** Student zlínské univerzity analyzoval jeho katalog ** Neuronová síť doposud prozkoumala 6 milionů snímků

Jakub Čížek, Filip Šedivý | 75

10 skrytých nastavení prohlížeče Google Chrome, která se můžou hodit

10 skrytých nastavení prohlížeče Google Chrome, která se můžou hodit

** Prohlížeč Google Chrome ukrývá mnoho zajímavých možností ** Našli jsme deset nejzajímavějších skrytých nastavení ** Můžete si například výrazně vylepšit práci s kartami

Karel Kilián | 18

Windows 10X už si můžete vyzkoušet. Novému systému Microsoft zjevně věří

Windows 10X už si můžete vyzkoušet. Novému systému Microsoft zjevně věří

** Windows 10X přijdou již ke konci roku ** Microsoft vydal emulátor, kde systém ukázal ** Vývojáři musí upravit své aplikace

Vladislav Kluska | 59



Aktuální číslo časopisu Computer

Megatest 12 bezdrátových sluchátek

Vyplatí se Apple z bazaru?

Test batohů pro notebooky

Vybíráme nejlepší sportovní hodinky