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 index6
, - január má index
1
, december index12
.
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.