V předchozím článku jsem podrobně popisoval používání základních operací pro práci s datem a časem. Dnes se zaměříme na to, jak s datem a časem počítat. A to vše opět na straně serveru, ale i na straně klienta.

DateDiff
Pomocí funkce DateDiff snadno a jednoduše zjistíme rozdíl mezi dvěmi daty. Funkce nemá problémy při práci s přestupnými roky ani po roce 2000 včetně přestupného roku 2000.

rozdil=datediff(interval,datum1,datum2)

Funkce Datediff má tři povinné parametry, parametr datum1 a datum2 jsou data, mezi nimiž chceme zjistit rozdíl. Parametr interval udává jednotky času, ve kterých chceme rozdíl mezi datumy vrátit.

Nastavení Význam
yyyy Vrácený rozdíl je v rocích
q Vrácený rozdíl je ve čtvtletích (čtvrtletí = 3 měsíce)
m Vrácený rozdíl je v měsících
d Vrácený rozdíl je ve dnech
w Vrácený rozdíl je v týdnech
h Vrácený rozdil je v hodinách
n Vrácený rozdíl je v minutách. Pozor – m vrací rozdíl v měsících, proto je pro minuty třeba použít n
s Vrácený rozdíl je v sekundách

V příkladu číslo 1 jsou uvedeny možnosti použití funkce DateDiff pro jednotlivé možnosti nastavení parametru interval.

Příklad 1:

Response.Write („Od 1.1.2000 uplynulo „&datediff(„yyyy“,“1.1.2000″,now())&“ roků“)
Response.Write („<br>“)
Response.Write („Od 1.1.2000 uplynulo „&datediff(„q“,“1.1.2000″,now())&“ čtvrtletí“)
Response.Write („<br>“)
Response.Write („Od 1.1.2000 uplynulo „&datediff(„m“,“1.1.2000″,now())&“ měsíců“)
Response.Write („<br>“)
Response.Write („Od 1.1.2000 uplynulo „&datediff(„d“,“1.1.2000″,now())&“ dní“)
Response.Write („<br>“)
Response.Write („Od 1.1.2000 uplynulo „&datediff(„w“,“1.1.2000″,now())&“ týdnů“)
Response.Write („<br>“)
Response.Write („Od 1.1.2000 uplynulo „&datediff(„h“,“1.1.2000″,now())&“ hodin“)
Response.Write („<br>“)
Response.Write („Od 1.1.2000 uplynulo „&datediff(„n“,“1.1.2000″,now())&“ minut“)
Response.Write („<br>“)
Response.Write („Od 1.1.2000 uplynulo „&datediff(„s“,“1.1.2000″,now())&“ sekund“)
Response.Write („<br>“)
Response.Write („Do začátku tisiciciletí zbývá „&datediff(„d“,“1.1.2001″,now())&“ dní“) Response.Write („<br>“)
Response.Write („Do začátku tisiciciletí zbývá „&abs(datediff(„d“,“1.1.2001″,now()))&“ dní“)

Jak jste si jistě všichni všimli, v příkladu jsem použil i datum z budoucnosti. Funkce DateDiff pracuje tak, že pokud je datum1 větší než datum2, tak vrací záporné číslo. Této vlastnosti lze využít při porovnávání datumů.

V úvodu popisu funkce DateDiff jsem se zmínil, že funkce NEMÁ problémy s přestupnými roky. Pro ty co tomuto tvrzení nevěří tu mám příklad 2, který poskytne důkaz. V příkladu si ukážeme zjištění počtu dnů mezi datem 27.2. a 1.3. pro různé roky.

Nejprve ale malá ukázka z kalendáře. Výchozí den si označíme písmenem D a pokud rok dané datum obsahuje napíšeme do příslušné kolonky 1. Nakonec sečteme jednotlivé řádky tabulky a dostaneme počet dní mezi 27.2. a 1.3. pro jednotlivé roky

rok 27.2. 28.2. 29.2 1.3. počet dní od 27.2. do 1.3.
1996 D 1 1 1 3
1999 D 1 0 1 2
2000 D 1 1 1 3
2001 D 1 0 1 2


A teď konečně to, co jsme si udělali ručně, provedeme pomocí funkce Datediff. Příklad 2:

response.write(„Mezi 27.2. a 1.3. v roce 1996 jsou „&datediff(„d“,“27.2.1996″,“1.3.1996″)&“ dny“)
Response.Write („<br>“)
response.write(„Mezi 27.2. a 1.3. v roce 1999 jsou „&datediff(„d“,“27.2.1999″,“1.3.1999″)&“ dny“)
Response.Write („<br>“)
response.write(„Mezi 27.2. a 1.3. v roce 2000 jsou „&datediff(„d“,“27.2.2000″,“1.3.2000″)&“ dny“)
Response.Write („<br>“)
response.write(„Mezi 27.2. a 1.3. v roce 2001 jsou „&datediff(„d“,“27.2.2001″,“1.3.2001″)&“ dny“)
Response.Write („<br>“)

Pokud porovnáte počty dní mezi daty pro jednotlivé roky ve výsledku příkladu 2 s počty dnů uvedenými v tabulce zjistíte, že jsou shodné a to je důkaz, že funkce DateDiff nemá problémy s přestupnými roky

DateAdd
Funkce DateAdd přičítá k zadanému datumu zadaný interval (rok, mesic atd.). Funkce správně počítá s přestupnými roky:

vysledek=dateadd(jednotky,kolik,datum)

Fukce DateAdd má tři povinné parametry a to sice datum, jednotky ve kterých bude počítáno a počet jednotek.

Nastavení Význam
yyyy Jsou přičítány (odečítány) roky
q Jsou přičítány (odečítány) čtvrtletí
m Jsou přičítány (odečítány) měsíce
d Jsou přičítány (odečítány) dny
w Jsou přičítány (odečítány) týdny
h Jsou přičítány (odečítány) hodiny
n Jsou přičítány(odečítány) minuty
s Jsou přičítány(odečítány) sekundy


Příklad 3:

Response.Write („Loni bylo :“&dateadd(„yyyy“,-1,now))
Response.Write („<br>“)
Response.Write („Za dva roky bude :“&dateadd(„yyyy“,2,now))
Response.Write („<br>“)
Response.Write(„1.únor 2000 a měsic navrch je: „&dateadd(„m“,1,“1.2.2000″))
Response.Write („<br>“)
Response.Write(„30 dní k 1. unoru 2000 je: „&dateadd(„d“,30,“1.2.2000″))
Response.Write („<br>“)
Response.Write(„30 dní k 1. unoru 2001 je: „&dateadd(„d“,30,“1.2.2001″))
Response.Write („<br>“)
Response.Write(„Den po 28.únoru 1999 je „&dateadd(„d“,1,“28.2.1999″))
Response.Write („<br>“)
Response.Write(„Den po 28.únoru 2000 je „&dateadd(„d“,1,“28.2.2000″))
Response.Write („<br>“)
Response.Write(„Den po 28.únoru 2001 je „&dateadd(„d“,1,“28.2.2001″))
Response.Write („<br>“)

Funkce DateAdd umí zpracovávat i záporná čísla a díky tomu lze od zadaného data odečítat.

DatePart
Funkce DatePart vrací část předaného data v jednotce, kterou si vybereme. Většinu věcí, které umožňuje funkce DatePart, lze provést pomocí funkcí Year, Moth, Day, Hour, Minute a Second, jenž byly popsány v minulém dílu článku. Funkce DatePart má, ale mnohem více možností a její používání je pružnější.

vysledek=datepart(cas,datum)

Funkce DatePart má dva povinné parametry a to sice datum a idetifikaci části data, které chceme obdržet

Nastavení Význam
yyyy Vrací rok ze zadaného data
q Vrací čtvrtletí, ve kterém je zadané datum
m Vrací měsíc ze zadaného data
d Vrací den ze zadaného data
w Vrací týden ve kterém je zadané datum
h Vrací hodinu ze zadaného času
n Vrací minutu ze zadaného času
s Vrací sekundu ze zadaného času


Pokud je zadán jen čas do datové položky a chcete získat například informace o roku,měsíci dni či čtvrtletí připravte se na to, že obdržíte 30.12.1889. Pokud je zadáno jenom datum a požadujete informace o čase předpokládá se že čas je 0:0:0

Příklad 4:

Response.Write(„Zpracováván bude údaj 13:35:15“)
Response.Write („<br>“)
Response.write(„Rok z výrazu kde je pouze čas: „&datepart(„yyyy“,“12:35:15″))
Response.Write („<br>“)
Response.write(„Měsíc z výrazu kde je pouze čas: „&datepart(„m“,“12:35:15″))
Response.Write („<br>“)
Response.write(„Den z výrazu kde je pouze čas: „&datepart(„d“,“12:35:15″))
Response.Write („<br>“)
Response.Write („<br>“)
Response.Write(„Zpracováván bude údaj 12.5.2000“)
Response.Write („<br>“)
Response.write(„Hodina z výrazu kde chybí časový údaj: „&datepart(„h“,“12.5.2000″))
Response.Write („<br>“)
Response.write(„Minuta z výrazu kde chybí časový údaj: „&datepart(„n“,“12.5.2000″))
Response.Write („<br>“)
Response.write(„Sekunda z výrazu kde chybí časový údaj: „&datepart(„s“,“12.5.2000″))
Response.Write („<br>“)
Response.Write („<br>“)
Response.Write(„Prozpracování bude použit aktuální čas a datum („&now&“)“)
Response.Write („<br>“)
Response.write(„Aktuální čtvrtletí je: „&datepart(„q“,now))
Response.Write („<br>“)
Response.write(„Aktuální měsíc je: „&datepart(„m“,now))
Response.Write („<br>“)
Response.write(„Aktuální rok je: „&datepart(„yyyy“,now))

Dodatek k funkcím DateDiff,DatePart a DateAdd
V kapitolách o funkcích DateDiff,DatePart a DateAdd jsem se zmínil pouze o povinných parametrech těchto funkcí. Tyto funkce, ale mají i dva nepovinné parametry. Kompletní způsob volání těchto funkcí pak vypadá takto:

rozdil=datediff(interval,datum1,datum2,prvnidenvtydnu,prvnitydenvroce) vysledek=dateadd(jednotky,kolik,datum,prvnidenvtydnu,prvnitydenvroce) vysledek=datepart(cas,datum,prvnidenvtydnu,prvnitydenvroce)

Prvnidenvtydnu urcuje, kterým dnem začíná týden, pokud je vynecháno použije se systémové nastavení.

Prvnitydenvroce určuje, který týden v roce je první. Pokud je vynecháno, předpokládá se, že první týden je ten, který obsahuje 1. leden.

To je pro dnešek vše. V dalším díle miniseriálu o datu a času nás čeká nejen několik konverzních funkční, ale také stopky, které nám umožní měřit až 20 různých času s přesností větší, než je jedna sekunda.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět