14. diel - Dátum a čas v Pythone
V predchádzajúcom cvičení, Riešené úlohy k 12. lekcii OOP v Pythone, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V dnešnom tutoriále objektovo orientovaného programovania v
Pythone sa pozrieme na postupy, ako zisťovať a používať aktuálny
dátum a čas. Tieto zručnosti nám budú užitočné napríklad pri
odovzdávaní informácií používateľom našich aplikácií alebo pri
vytváraní rôznych časom vymedzených udalostí. Zameriame sa hlavne na
knižnicu time
, ktorá ponúka funkcie pre prácu s časom, a na
knižnicu calendar
, určenú na spracovanie dát a kalendára.
Knižnica time
Prvou a veľmi užitočnou knižnicou je time
. Poskytne nám
informácie o aktuálnom čase a dátume, a navyše nám pomôže aj s
prehľadným vypísaním dát pre užívateľov. Pozrime sa na
najdôležitejšie funkcie, ktoré obsahuje.
Funkcia time()
Základnou funkciou modulu time
je rovnomenná funkcia
time()
. Jej návratovou hodnotou (označovanou ako
tick
) je desatinné číslo (float
) ukazujúce počet
sekúnd, ktoré ubehli od 1.1.1970. Poďme si túto hodnotu vypísať:
import time
print(time.time())
Hodnota ako taká má mnoho využití. Ak napríklad kdekoľvek v našom
programe založíme premennú s aktuálnou hodnotou času, neskôr môžeme
vytvoriť druhú „aktuálnejšiu“ hodnotu. Neskôr po odčítaní oboch
hodnôt zistíme, koľko času medzi jednotlivými bodmi v programe prebehlo.
Podobným spôsobom ide napríklad vytvoriť aj časovaný cyklus
while
:
import time start_time = time.time() je_tik = True while (time.time() - start_time) <= 1: if je_tik: print("tik", end=" ") else: print("tak", end=" ") je_tik = not je_tik
Vo výstupe konzoly uvidíme:
Konzolová aplikácia
tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak tik tak ...
Niektoré funkcie nemožno demonštrovať v našom kompiléri kvôli oneskoreniam pri prenose dát cez internet.
Podobne je možné využiť aj funkciu process_time()
. Tá sa od
time()
líši tým, že jej hodnota udáva počet sekúnd
ubehnutých od spustenia aktuálneho procesu (nášho vlastného programu):
import time pocatecni_cas = time.process_time() # Kód našeho programu ... uplynuly_cas = time.process_time() - pocatecni_cas print(f"Uplynulý procesorový čas: {uplynuly_cas} sekund")
Funkcia process_time()
vracia celkový procesorový
čas od štartu programu, čo je kombinácia užívateľského a
systémového času. Nie skutočný uplynutý čas (wall-clock time). Je tomu
tak preto, že nezahŕňa čas strávený počas nečinnosti procesora (čakanie
na vstup a podobne).
Funkcia localtime()
Táto funkcia nám poskytuje aktuálne informácie z prostredia
používateľa. Všetky informácie sú v špeciálnom objekte
struct_time
. Tento objekt (časová štruktúra) je tvorený
deviatimi číslami:
Index | Vlastnosť | Hodnota |
---|---|---|
0 | Rok | 2023 |
1 | Mesiac | 1 - 12 |
2 | Deň | 1 - 31 |
3 | Hodina | 0 - 23 |
4 | Minúta | 0 - 59 |
5 | Sekunda | 0 - 61 |
6 | Deň v týždni | 0 - 6 (0 = Pondelok) |
7 | Deň v roku | 1 - 366 (Juliánsky deň) |
8 | Letný čas | 0 / 1 |
import time
print(time.localtime())
Objekt nám umožňuje ľubovoľne naformátovať aktuálny dátum, napríklad priamym výberom pomocou indexu:
import time
local = time.localtime()
print(f"Dnes je {local[2]}. {local[1]}. {local[0]}.")
Funkcie asctime()
Pre stručne a čitateľne definované formátovanie máme k dispozícii aj
funkciu asctime()
. Do funkcie vložíme časový objekt
(struct_time
) a vráti sa nám reťazec s vypísanými hodnotami vo
vopred určenom poradí:
import time
local = time.localtime()
print(f"Datum a čas: {time.asctime(local)} ")
Formátu, v ktorom poskytuje výstup funkcie
asctime()
, sa hovorí ctime. Označenie pochádza
od formátu, ako je používaný v jazyku C v jeho funkcii
ctime()
.
Funkcia sleep()
Užitočná funkcia sleep()
nám umožňuje náš program na
nejakú dobu pozdržať. Program zastaví na presný časový úsek, ktorý jej
odovzdáme ako parameter. Skúsme si to:
import time print("Start") time.sleep(3) # program se na tři sekundy zastaví ("uspí") print("Konec")
Funkcia strftime()
Funkcia strftime()
nám umožňuje formátovať čas a dátum
podľa vlastného uváženia. Pomocou rôznych formátovacích kódov presne
definujeme, akým spôsobom chceme čas a dátum zobraziť:
import time
local = time.localtime()
formatovany_cas = time.strftime("%d.%m.%Y %H:%M:%S", local)
print(f"Aktuální datum a čas ve formátu DD.MM.RRRR HH:MM:SS: {formatovany_cas}")
Funkcia strptime()
Zatiaľ čo funkcia strftime()
konvertuje časový objekt na
reťazec, strptime()
robí pravý opak. Umožňuje nám prevádzať
reťazce s dátumom a časom späť na časové objekty
(struct_time
). To je veľmi užitočné, ak potrebujeme analyzovať
dátum a čas z externých zdrojov:
import time
cas_text = "20.10.2023 15:30:00"
cas_objekt = time.strptime(cas_text, "%d.%m.%Y %H:%M:%S")
print(f"Převedeno na struct_time: {cas_objekt}")
Funkcia gmtime()
Funkcia gmtime()
vracia aktuálny čas vo formáte UTC
(Coordinated Universal Time), čo je svetový čas. Je podobná funkcii
localtime()
, ale bez ohľadu na časovú zónu používateľa:
import time
utc_cas = time.gmtime()
print(f"Aktuální UTC čas: {time.asctime(utc_cas)}")
Toto boli základné funkcie knižnice time
, s ktorými sa pri
svojej práci často stretávame. Knižnica je samozrejme oveľa bohatšia a
vyvíja sa, takže pre hlbšie bádanie v čase je ideálne nahliadnuť do oficiálnej dokumentácie
knižnice.
Knižnica calendar
Druhou knižnicou, ktorú si dnes predstavíme, je calendar
.
Knižnica pridáva nové možnosti formátovania výpisu dát pre užívateľov.
Pozrime sa na jej základné funkcie.
Funkcia month()
Prvou peknou funkciou je month()
. Pri použití musíme
špecifikovať, aký rok a mesiac si prajeme vybrať. Funkcia nám potom vráti
niekoľko riadkov textu s veľmi prehľadným kalendárom:
import calendar
month = calendar.month(2023, 10)
print("Kalendář na tento měsíc")
print(month)
Funkcia weekheader()
Funkcia weekheader()
vytvorí hlavičku pre týždeň, čo je
užitočné pre formátovanie kalendára:
import calendar
hlavicka = calendar.weekheader(3) # parametr je šířka jednotlivých dnů
print(hlavicka)
Táto funkcia je ideálna na vytváranie prehľadných kalendárnych výstupov s konkrétnou šírkou pre každý deň v týždni.
Funkcia monthrange()
Keď budeme o danom mesiaci potrebovať viac informácií, dobre využijeme
funkciu monthrange()
. Funkcia berie v parametroch rok a mesiac.
Dostaneme z nej tuple dvoch čísel v tvare: ktorý deň v týždni je
prvým dňom v mesiaci, celkový počet dní v mesiaci. Aby sme sa práci s
tuple vyhli (tento dátový typ zatiaľ nepoznáme), prevedieme si ju na nám
známy zoznam:
import calendar
rok = 2023
mesic = 11
month_range = calendar.monthrange(rok, mesic)
seznam_month_range = list(month_range) # nám zatím neznámý typ tuple převedeme na seznam
dny = ["pondělí", "úterý", "středa", "čtvrtek", "pátek", "sobota", "neděle"]
# Funkce monthrange() indexuje dny od 0 a měsíce od 1. Proto je níže v seznamu jako první prázdný řetězec
mesice = ["", "leden", "únor", "březen", "duben", "květen", "červen", "červenec", "srpen", "září", "říjen", "listopad", "prosinec"]
den = dny[seznam_month_range[0]]
mesic_slovem = mesice[mesic]
pocet_dni = seznam_month_range[1]
print(f"Prvním dnem v měsíci {mesic_slovem} je v roce 2023 {den} a {mesic_slovem} má {pocet_dni} dní.")
Dátový typ tuple je v podstate usporiadaná n-tica veľmi podobná zoznamu. Viac sa o tomto type dozvieme v kurze Kolekcia v Pythone.
Pri určovaní dňa v týždni si musíme dať pozor na dve veci:
- pondelok má index
0
a nedeľa index6
, - január má index
1
, december index12
.
weekday()
Funkcia weekday()
nám bude užitočná, ak budeme chcieť
rýchlo zistiť, akým dňom v týždni bol/je/bude nejaký dátum. Parametre
sú rok, mesiac a deň. Funkcia vráti jediné číslo a to index dňa v
týždni (0..6) zodpovedajúci zadanému dátumu:
import calendar
# Seznam dnů v týdnu s indexy
dny = ["pondělí", "úterý", "středa", "čtvrtek", "pátek", "sobota", "neděle"]
den = calendar.weekday(2023, 10, 5)
print(f"5. října 2023 byl {dny[den]}.")
Funkcia isleap()
Pokiaľ budeme chcieť rýchlo zistiť, či je daný rok priestupný alebo
nie, poslúži nám funkcia isleap()
. Funkcia nám vráti ako
odpoveď iba True
/ False
:
import calendar
je_prestupny = calendar.isleap(2023)
print(f"Je rok 2023 přestupný? {je_prestupny}")
je_prestupny = calendar.isleap(2024)
print(f"Bude rok 2024 přestupný? {je_prestupny}")
Funkcia leapdays()
Funkcia leapdays()
umožní zistiť, koľko prestupných rokov
bolo v intervale medzi dvoma rokmi. Je užitočná, ak potrebujeme rýchlo
spočítať počet prestupných rokov v určitom časovom období:
import calendar
pocet_prestupnych = calendar.leapdays(2000, 2023)
print(f"Mezi roky 2000 a 2023 bylo {pocet_prestupnych} přestupných let.")
Rovnako ako knižnica time
je aj calendar
výrazne
rozsiahlejší. Pre hlbšie štúdium opäť odkážeme na oficiálnej dokumentácii
knižnice.
V budúcej lekcii, Dátum a čas v Pythone druhýkrát - Knižnica datetime , si ešte viac rozšírime možnosti práce s
dátumom a časom. Pozrieme na knižnicu datetime
v Pythone.