Skladanie času a dátumu
Doteraz sme získavali z času a dátumu jednotlivé komponenty napr. minúty, hodiny či deň v mesiaci. Skúsme ísť
nato z druhej strany, Vytvorme si s pomocou funkcii DateSerial()
a TimeSerial()
ľubovoľný dátum a čas.
Syntax funkcie DateSerial()
a TimeSerial()
je nasledovná:
DateSerial(rok, mesiac, deň) TimeSerial(hodina, minúta, sekunda)
Návratový typ hodnoty oboch funkcii je Variant(Date)
.
Skúsme naprogramovať jednoduchý program, ktorý nám vytvorí vlastný dátum.
Sub tvorbaDatumu Dim datum As Variant datum = DateSerial(2018,06,20) MsgBox datum End Sub
Tvoríme si vlastný dátum
Ak chceme vypísať z novovytvoreného dátumu len rok, jediným argumentom funkcie Year()
sa stane
funkcia DateSerial()
s vlastnými argumentmi.
Sub tvorbaDatumu Dim datum As Variant datum = Year(DateSerial(2018,06,20)) MsgBox datum End Sub
Vypíšeme len rok
Čo ak zabudneme na argument charakterizujúci mesiac vo funkcii DateSerial()
?
Sub tvorbaDatumu Dim datum As Variant datum = DateSerial(2018,20) MsgBox datum End Sub
Zabudli sme na jeden argument.
Výsledkom spustenia programu je chybová hláška. Preto je potrebné použiť všetky argumenty funkcie
DateSerial()
.
Okrem toho je potrebné kontrolovať, či dátum je prípustný. Nemôžte vytvoriť dátum, ktorý pozostáva z 13 mesiaca, čo neodpovedá realite. Za skúšku nič nedáme a vytvorme program s nereálnym dátumom.
Sub tvorbaDatumu On Error Resume Next Dim datum As Variant datum = DateSerial(2018,04,31) MsgBox datum End Sub
Nereálny dátum
Chyba sa ukrýva v tom, že mesiac apríl má 30 dní, nie 31! Aby nám nespadol program, pridali sme On
Error Resume Next
. Presvedčme sa, že to tak platí.
Sub tvorbaDatumu Dim datum As Variant datum = DateSerial(2018,04,30) MsgBox datum End Sub
Správny dátum
Podobne budeme postupovať pri funkcii TimeSerial()
. Začneme ukážkou základného využitia funkcie
TimeSerial()
.
Sub tvorbaCasu Dim cas As Variant cas = TimeSerial(12,05,47) MsgBox cas End Sub
Vytvorili sme si vlastný čas
Vypíšme len sekundy.
Sub tvorbaCasu Dim cas As Variant cas = Second(TimeSerial(12,05,47)) MsgBox cas End Sub
Vypísali sme len sekundy
Správanie programu pri zabudnutí nejakého argumentu je rovnaké ako u funkcii DateSerial()
. Presvedčme
sa!
Sub tvorbaCasu Dim cas As Variant cas = TimeSerial(12,05) MsgBox cas End Sub
Zabudli sme na jeden argument
Rozdiely medzi funkciami DateSerial()
a TimeSerial()
zatiaľ nie sú veľké. Je tomu tak i pri
prekročení sekúnd? To znamená, že napíšeme argument sekúnd mimo interval 0-59.
Sub tvorbaCasu Dim cas As Variant On Error Resume Next cas = TimeSerial(12,20,63) MsgBox cas End Sub
Sekundy sú mimo interval 0-59
Podľa dokumentácie môžeme prekročiť
intervaly jednotlivých argumentov. Využili sme uvedený príklad v zmienenej dokumentácie a výsledok nás
prekvapil. Zdá sa, že aktuálne po zadaní argumentu mimo interval nám program bez On Error Resume Next
skončí s chybovou hláškou.
Existujú prípady, kedy nám program nespadne a skutočne sa správa podľa dokumentácie. Jeden takýto príklad si uvedieme.
Sub tvorbaCasu Dim cas As Variant cas = TimeSerial(24,59,59) MsgBox cas End Sub
Príklad, kedy nám program nespadne
Dynamická tvorba dátumu a času
Pod slovným spojením „dynamická tvorba“ rozumieme vytvorenie dátumu a času prostredníctvom premenných. Tu sa práve
ukazuje najväčšia výhoda využitia funkcii DateSerial()
a TimeSerial()
. Pretože prináša
možnosť vykonávať rôzne výpočty a podľa toho zobrazovať dátum a čas.
Sub tvorbaDatumuACasu Dim rok As Integer Dim mesiac As Integer Dim den As Integer Dim datum As Variant Dim hodina As Integer Dim minuta As Integer Dim sekunda As Integer Dim cas As Variant rok = Int((2018-2000+1)*Rnd+2000) mesiac = Int((12-1+1)*Rnd+1) den = Int((28-1+1)*Rnd+1) datum = DateSerial(rok,mesiac,den) hodina = Int((23-0+1)*Rnd+0) minuta = Int((59-0+1)*Rnd+0) sekunda = Int((59-0+1)*Rnd+0) cas = TimeSerial(hodina,minuta,sekunda) MsgBox datum & Chr(10) & cas End Sub
Tvorba dátumu a času prostredníctvom
premenných
Dátum a čas sme vytvorili random spôsobom. Pre zjednodušenie sme vynechali jednotlive odlišností medzi počtom dní
v mesiaci a zvolili sme interval 1-28 v premenne den
.