Lekce 14 - Datum a čas v Pythonu
V předešlém cvičení, Řešené úlohy k 12. lekci OOP v Pythonu, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
V dnešním tutoriálu objektově orientovaného programování v
Pythonu se podíváme na postupy, jak zjišťovat a používat
aktuální datum a čas. Tyto dovednosti nám budou užitečné například při
předávání informací uživatelům našich aplikací nebo při vytváření
různých časem vymezených událostí. Zaměříme se hlavně na knihovnu
time
, která nabízí funkce pro práci s časem, a na knihovnu
calendar
, určenou pro zpracování dat a kalendáře.
Knihovna time
První a velmi užitečnou knihovnou je time
. Poskytne nám
informace o aktuálním čase a datu, a navíc nám pomůže i s přehledným
vypsáním dat pro uživatele. Podívejme se na nejdůležitější funkce,
které obsahuje.
Funkce time()
Základní funkcí modulu time
je stejnojmenná funkce
time()
. Její návratovou hodnotou (označovanou jako
tick
) je desetinné číslo (float
) ukazující počet
sekund, které uběhly od 1.1.1970. Pojďme si tuto hodnotu vypsat:
import time
print(time.time())
Hodnota jako taková má mnoho využití. Pokud například kdekoliv v našem
programu založíme proměnnou s aktuální hodnotou času, později můžeme
vytvořit druhou "aktuálnější" hodnotu. Posléze po odečtení obou hodnot
zjistíme, kolik času mezi jednotlivými body v programu proběhlo. Podobným
způsobem jde například vytvořit i č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
Ve výstupu konzole uvidíme:
Konzolová aplikace
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 ...
Některé funkce nelze demonstrovat v našem kompileru kvůli zpožděním při přenosu dat přes internet.
Podobně lze využít i funkci process_time()
. Ta se od
time()
liší tím, že její hodnota udává počet sekund
uběhlých od spuštění aktuálního procesu (našeho 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")
Funkce process_time()
vrací celkový procesorový
čas od startu programu, což je kombinace uživatelského a
systémového času. Nikoli skutečný uplynulý čas (wall-clock time). Je tomu
tak proto, že nezahrnuje čas strávený během nečinnosti procesoru
(čekání na vstup a podobně).
Funkce localtime()
Tato funkce nám poskytuje aktuální informace z prostředí uživatele.
Všechny informace jsou ve speciálním objektu struct_time
. Tento
objekt (časová struktura) je tvořen devíti čísly:
Index | Vlastnost | Hodnota |
---|---|---|
0 | Rok | 2023 |
1 | Měsíc | 1 - 12 |
2 | Den | 1 - 31 |
3 | Hodina | 0 - 23 |
4 | Minuta | 0 - 59 |
5 | Sekunda | 0 - 61 |
6 | Den v týdnu | 0 - 6 (0 = Pondělí) |
7 | Den v roce | 1 - 366 (Juliánský den) |
8 | Letní čas | 0 / 1 |
Nejprve si vypišme celou strukturu:
import time
print(time.localtime())
Objekt nám umožňuje libovolně naformátovat aktuální datum, například přímým výběrem pomocí indexu:
import time
local = time.localtime()
print(f"Dnes je {local[2]}. {local[1]}. {local[0]}.")
Funkce asctime()
Pro stručně a čitelně definované formátování máme k dispozici také
funkci asctime()
. Do funkce vložíme časový objekt
(struct_time
) a vrátí se nám řetězec s vypsanými hodnotami v
předem určeném pořadí:
import time
local = time.localtime()
print(f"Datum a čas: {time.asctime(local)} ")
Formátu, ve kterém poskytuje výstup funkce
asctime()
, se říká ctime. Označení pochází
od formátu, jak je používán v jazyku C v jeho funkci
ctime()
.
Funkce sleep()
Užitečná funkce sleep()
nám umožňuje náš program na
nějakou dobu pozdržet. Program zastaví na přesný časový úsek, který jí
předáme jako parametr. Zkusme si to:
import time print("Start") time.sleep(3) # program se na tři sekundy zastaví ("uspí") print("Konec")
Funkce strftime()
Funkce strftime()
nám umožňuje formátovat čas a datum podle
vlastního uvážení. Pomocí různých formátovacích kódů přesně
definujeme, jakým způsobem chceme čas a datum zobrazit:
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}")
Funkce strptime()
Zatímco funkce strftime()
konvertuje časový objekt na
řetězec, strptime()
dělá pravý opak. Umožňuje nám
převádět řetězce s datem a časem zpět na časové objekty
(struct_time
). To je velmi užitečné, pokud potřebujeme
analyzovat datum a čas z externích zdrojů:
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}")
Funkce gmtime()
Funkce gmtime()
vrací aktuální čas ve formátu UTC
(Coordinated Universal Time), což je světový čas. Je podobná funkci
localtime()
, ale bez ohledu na časovou zónu uživatele:
import time
utc_cas = time.gmtime()
print(f"Aktuální UTC čas: {time.asctime(utc_cas)}")
Toto byly základní funkce knihovny time
, se kterými se při
své práci často setkáme. Knihovna je samozřejmě daleko bohatší a
vyvíjí se, takže pro hlubší bádání v čase je ideální nahlédnout do
oficiální dokumentace
knihovny.
Knihovna calendar
Druhou knihovnou, kterou si dnes představíme, je calendar
.
Knihovna přidává nové možnosti formátování výpisu dat pro uživatele.
Podívejme se na její základní funkce.
Funkce month()
První hezkou funkcí je month()
. Při použití musíme
specifikovat, jaký rok a měsíc si přejeme vybrat. Funkce nám poté vrátí
několik řádků textu s velmi přehledným kalendářem:
import calendar
month = calendar.month(2023, 10)
print("Kalendář na tento měsíc")
print(month)
Funkce weekheader()
Funkce weekheader()
vytvoří hlavičku pro týden, což je
užitečné pro formátování kalendáře:
import calendar
hlavicka = calendar.weekheader(3) # parametr je šířka jednotlivých dnů
print(hlavicka)
Tato funkce je ideální pro vytváření přehledných kalendářních výstupů s konkrétní šířkou pro každý den v týdnu.
Funkce monthrange()
Když budeme o daném měsíci potřebovat více informací, dobře
využijeme funkci monthrange()
. Funkce bere v parametrech rok a
měsíc. Dostaneme z ní tuple dvou čísel ve tvaru: který den v týdnu je
prvním dnem v měsíci, celkový počet dní v měsíci. Abychom se práci
s tuple vyhnuli (tento datový typ zatím neznáme), převedeme si ji na nám
známý seznam:
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í.")
Datový typ tuple je v podstatě uspořádaná n-tice velmi podobná seznamu. Více se o tomto typu dozvíme v kurzu Kolekce v Pythonu.
U určování dne v týdnu si musíme dát pozor na dvě věci:
- pondělí má index
0
a neděle index6
, - leden má index
1
, prosinec index12
.
Funkce weekday()
Funkce weekday()
nám bude užitečná, pokud budeme chtít
rychle zjistit, jakým dnem v týdnu bylo/je/bude nějaké datum. Parametry jsou
rok, měsíc a den. Funkce vrátí jediné číslo a to index dne v týdnu
(0..6) odpovídající zadanému datu:
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]}.")
Funkce isleap()
Pokud budeme chtít rychle zjistit, jestli je daný rok přestupný nebo ne,
poslouží nám funkce isleap()
. Funkce nám vrátí jako odpověď
pouze 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}")
Funkce leapdays()
Funkce leapdays()
umožní zjistit, kolik přestupných let bylo
v intervalu mezi dvěma roky. Je užitečná, pokud potřebujeme rychle
spočítat počet přestupných let v určitém časovém období:
import calendar
pocet_prestupnych = calendar.leapdays(2000, 2023)
print(f"Mezi roky 2000 a 2023 bylo {pocet_prestupnych} přestupných let.")
Stejně jako knihovna time
je i calendar
výrazně
rozsáhlejší. Pro hlubší studium opět odkážeme na oficiální dokumentaci
knihovny.
V příští lekci, Datum a čas v Pythonu podruhé - Knihovna datetime, si ještě více rozšíříme možnosti práce s
datem a časem. Podíváme na knihovnu datetime
v Pythonu.