Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

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á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 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()
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é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

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 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"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, 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) # 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 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("Calendar for this month")
print(month)

Funkcia weekheader()

Funkcia weekheader() vytvorí hlavičku pre týždeň, čo je užitočné pre 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í, 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

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() 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

# 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()

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

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 hlbšie štúdium opäť odkážeme na oficiálnu dokumentáciu 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