IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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
Najprv si vypíšme celú štruktúru:
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 index 6,
  • január má index 1, december index 12.
Funkcia 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.


 

Predchádzajúci článok
Riešené úlohy k 12. lekcii OOP v Pythone
Všetky články v sekcii
Objektovo orientované programovanie v Pythone
Preskočiť článok
(neodporúčame)
Dátum a čas v Pythone druhýkrát - Knižnica datetime
Článok pre vás napísal Marek Bečvář
Avatar
Užívateľské hodnotenie:
1 hlasov
Marek Bečvář
Aktivity