Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

15. diel - Dátum a čas v Pythone

V predchádzajúcom cvičení, Riešené úlohy k 13. lekcii OOP v Pythone, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V dnešnom tutoriáli 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 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 na 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 dátume a čase, 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 vytvorí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 ubehlo. Podobným spôsobom sa dá napríklad vytvoriť aj časovaný cyklus while:

import time

start_time = time.time()
is_tick = True

while (time.time() - start_time) <= 1:
    if is_tick:
        print("tick", end=" ")
    else:
        print("tock", end=" ")
    is_tick = not is_tick

Vo výstupe konzoly uvidíme:

Konzolová aplikácia
tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock tick tock  ...

Niektoré funkcie nemožno demonštrovať v našom kompilátore 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

start_time = time.process_time()

# Code of our program ...

elapsed_time = time.process_time() - start_time
print(f"Elapsed processor time: {elapsed_time} seconds")

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 to 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"Today is {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"Date and time: {time.asctime(local)} ")

Formátu, v ktorom poskytuje výstup funkcie asctime(), sa hovorí ctime. Označenie pochádza od formátu používanom 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) # the program pauses ("sleeps") for three seconds
print("End")

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()
formatted_time = time.strftime("%d.%m.%Y %H:%M:%S", local)
print(f"Current date and time in the format DD.MM.RRRR HH:MM:SS: {formatted_time}")

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

time_text = "20.10.2023 15:30:00"
time_object = time.strptime(time_text, "%d.%m.%Y %H:%M:%S")
print(f"Converted to struct_time: {time_object}")

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_time = time.gmtime()
print(f"Current UTC time: {time.asctime(utc_time)}")

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 ďalš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("Calendar for this month")
print(month)

Funkcia weekheader()

Funkcia weekheader() vytvorí hlavičku pre týždeň, čo je užitočné na formátovanie kalendára:

import calendar

header = calendar.weekheader(3) # parameter is the width of each day
print(header)

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í, 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

year = 2023
month = 11
month_range = calendar.monthrange(year, month)
list_month_range = list(month_range)       # we convert the tuple type (currently unknown) to a list

days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
#  The monthrange() function indexes days from 0 and months from 1. Therefore, the first entry in the list below is an empty string
months = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]

first_day = days[list_month_range[0]]
month_name = months[month]
days_in_month = list_month_range[1]

print(f"The first day in {month_name} of 2023 is {first_day}, and {month_name} has {days_in_month} days.")

Dátový typ tuple je v podstate usporiadaná n-tica veľmi podobná zoznamu. Viac sa o tomto type dozvieme v kurze Kolekcie 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() 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

# List of days of the week with indexes
days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]

day = calendar.weekday(2023, 10, 5)
print(f"October 5, 2023 was a {days[day]}.")

Funkcia isleap()

Ak budeme chcieť rýchlo zistiť, či je daný rok prestupný alebo nie, poslúži nám funkcia isleap(). Funkcia nám vráti ako odpoveď iba True / False:

import calendar

is_leap = calendar.isleap(2023)
print(f"Is the year 2023 a leap year? {is_leap}")

is_leap = calendar.isleap(2024)
print(f"Will the year 2024 be a leap year? {is_leap}")

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

leap_years_count = calendar.leapdays(2000, 2023)
print(f"There were {leap_years_count} leap years between 2000 and 2023.")

Rovnako ako knižnica time je aj calendar výrazne rozsiahlejší. Pre ďalšie štúdium vás opäť odkážeme na oficiálnu dokumentáciu knižnice.

V nasledujú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 13. 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:
107 hlasov
Marek Bečvář
Aktivity