Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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 index 6,
  • leden má index 1, prosinec index 12.

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.


 

Předchozí článek
Řešené úlohy k 12. lekci OOP v Pythonu
Všechny články v sekci
Objektově orientované programování v Pythonu
Přeskočit článek
(nedoporučujeme)
Datum a čas v Pythonu podruhé - Knihovna datetime
Článek pro vás napsal Marek Bečvář
Avatar
Uživatelské hodnocení:
342 hlasů
Marek Bečvář
Aktivity