Předvánoční slevová akce PHP týden
Pouze tento týden sleva až 80 % na PHP e-learning!
Využij předvánočních slev a získej od nás 20 % bodů zdarma! Více zde

Lekce 10 - Datum a čas v Pythonu

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Statika v Pythonu, jsme si vysvětlili statiku v Pythonu. V této lekci bych chtěl přiblížit, jak v Pythonu pracujeme při zjišťování a používání aktuálního data a času. To nám může být užitečné například při předávání informací uživateli našich aplikací nebo při vytváření všemožných časem vymezených událostí.

Jak používat knihovny jsme si již říkali v předešlých lekcích. Dnes se zaměříme hlavně na knihovnu time (práce s časem) a knihovnu calendar (zpracování data/kalendáře).

time

První a velmi užitečnou knihovnou je knihovna 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 pro uživatele. Knihovnu si prvně naimportujeme:

import time

Abychom modul time mohli používat, musíme ho vždy na začátku programu takto naimportovat. A teď již k vlastním funkcím.

time()

Základní funkcí modulu time je stejnojmenná funkce time(). Její návratová hodnota (označovaná jako tick), se zprvu může zdát nečitelná. Jedná se o desetinné číslo (float) ukazující počet sekund, které uběhly od 1.1.1970. Zkusme si tuto hodnotu vypsat:

#!/usr/bin/env python3

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ý while loop:

import time

startTime = time.time()
while (time.time()-startTime) <= 3:
    # vlastní kód, který bude probíhat 3 vteřiny

Podobně lze využít i metodu time.clock(). Ta se od time.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).

localtime()

Tato metoda 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 9 čísly:

Index Vlastnost Hodnota
0 Rok 2019
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:

#!/usr/bin/env python3

import time
print(time.localtime())

Jeden způsob, jak data z tohoto objektu dostat, je přímým výběrem pomocí indexu:

#!/usr/bin/env python3

import time

local = time.localtime()
print("Dnes je {}. {}. {}.".format(local[2], local[1], local[0]))
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Takto můžeme vytvořit jakýkoliv styl formátování budeme chtít.

asctime()

Pro stručně a čitelně definované formátování můžeme použít funkci asctime(). Do funkce vložíme časový objekt (struct_time) a vrátí se nám text (string) s vypsanými hodnotami v předem určeném pořadí:

#!/usr/bin/env python3

import time

local = time.localtime()
print("Datum a čas: {} ".format(time.asctime(local)))

sleep()

Užitečná funkce sleep() nám umožňuje náš program na nějakou dobu pozdržet a to na přesný časový úsek, který předáme jako parametr. Zkusme si to:

#!/usr/bin/env python3

import time

print("Start")
time.sleep(3) #program se na 3 vteřiny zastaví ("uspí")
print("Konec")

Toto byly základní funkce knihovny time, se kterými se můžeme při své práci setkat. Pro hlubší bádání doporučuji vyhledání oficiálních popisů samotné knihovny.

calendar

Druhou knihovnou, kterou si dnes představíme, je calendar, který přidává nové možnosti formátování výpisu dat pro uživatele. Nové moduly musíme vždy na začátku naimportovat:

import calendar

month()

První hezkou metodou 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:

#!/usr/bin/env python3

import calendar

month = calendar.month(2019, 11)
print("Kalendář na tento měsíc")
print(month)

Pokud bychom chtěli podobný kalendář pro celý rok, můžeme použít funkci calendar() a jako parametr ji předat rok. Ta ale vrátí velké množství textu. Je tedy asi lepší používat jednotlivé měsíce, u kterých, pokud bude potřeba, můžeme dělat vlastní změny.

monthrange(rok, měsíc)

Když budeme o daném měsíci potřebovat více informací, dobře využijeme monthrange(). Dostaneme z ní dvě čísla a to ve tvaru (co je první den v měsíci za den v týdnu, celkový počet dní v měsíci):

#!/usr/bin/env python3

import calendar

mr = calendar.monthrange(2019, 11)
print(mr)

U určování dne v týdnu musíme dát pozor na 2 věci:

  • Pondělí má index 0 a neděle index 6
  • Leden má index 1, prosinec index 12

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 odpovídající zadanému datu:

#!/usr/bin/env python3

import calendar

#Seznam dnů v týdnu s indexy
dny_v_tydnu={0:"pondělí", 1:"úterý", 2:"středa", 3:"čtvrtek", 4:"pátek", 5:"sobota", 6:"neděle"}

den5 = calendar.weekday(2019, 11, 5)
print("5. listopadu bylo " + dny_v_tydnu[den5])

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.

#!/usr/bin/env python3

import calendar

leap1 = calendar.isleap(2019)
print("2019 přestupný? {}".format(leap1))

leap2 = calendar.isleap(2020)
print("2020 přestupný? {}".format(leap2))

Toto shrnuje potřebné moduly, které nám pomohou při práci s datem a s kalendáři.

Zajímavost - Rok 2038

U knihovny time jsme se zmínili o datu 1.1.1970. To je datum, kdy se zrodil operační systém UNIX.

Toto počitadlo, jak jsem již zmínil dříve, ukazuje počet sekund od začátku epochy. Odpočet běží v číslech typu Int32. Co znamená Int32? Jakékoli číslo ukážeme, program jej má uložené pomocí řady 32 bitů (nul a jedniček).

Tento fakt ale nese jeden problém. Jelikož se jedná o "pouze" 32 bitů, existuje zde reálný limit čísel, která takto mohou být vyjádřena. Přesněji od -2 147 483 648 do 2 147 483 647.

A stejný limit existuje i pro naše počítadlo času. Tento problém si uvědomuje již spousta lidí. Na internetu se o této věci můžeme dočíst více jako o "Problému roku 2038".

Pokud by se tato situace do uplynutí limitu nevyřešila, nastane pro naše počítače a i pro nás velmi zvláštní situace. Místo 19. 1. 2038 bychom se probudili do odpoledne 13. 12. 1901 8-).

Simulace posledních vteřin odpočtu

Problém roku 2038 – Wikipedie. [online]. Dostupné z: https://cs.wikipedia.org/…ém_roku_2038

V příští lekci, Knihovna datetime pro Python, téma data a času v Pythonu dokončíme.


 

 

Aktivity (4)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!