Datum in čas

V Pythonu imamo več načinov obravnave časa in datuma.Pri tem si pomagamo z ustreznimi moduli (knjižnicami), ki jih moramo na začetku programa uvoziti.

Pythonovova modula time in calendar pomagata pri sledenju datuma in časa. Imamo tudi modul datetime, ki tudi nudi razrede za nadzor datuma in časa.

Imamo dva dva tipa časovnih in datumskih objektov (naivni in zavedajoči se (aware)). Slednji upoštevajo tudi časovni pas in prehod na zimski čas. Naivni način je bolj preprost.

Časovna terka

Python običajno obravnava čas kot skupino devetih števil. Pomen teh števil v tej terki (začenši z indeksom 0) je naslednji

Indeks Pomen Primer
0 4 mestno število za leto) 2016
1 Mesec 1 - 12
2 Dan 1 - 31
3 Ura 0 - 23
4 Minuta 0 - 59
5 Sekunda 0 - 60
6 Dan v tednu 0 - 6 (0 označuje ponedeljek
7 Dan v letu 1 - 366
8 Prehod v zimski čas -1, 0, 1, -1


Kaj je tik (tick)

Pri Pythonu lahko s tiki merimo čas v delčkih, izraženih v sekundah začenši s 1. januarjem 1990 ob 12.00.

Za delo s tiki moramo v program najprej uvoziti modul time:

Primer:

import time
ticktock = time.time();
print("Stevilo tikov:", ticktock)


Dobili bi izpis časa v tikih:

Stevilo tikov: 1548237446.6856797

Izpis trenutnega časa bi dobili tako:

import time;
cas = time.localtime(time.time())
print ("Leto:", cas[0])
print ("Mesec:", cas[1])
print ("Dan:", cas[2])
print ("Ura:", cas[3])
print ("Minuta:", cas[4])


Kar bi dalo naslednji izpis:

Leto: 2019
Mesec: 1
Dan: 23
Ura: 11
Minuta: 15

Lahko pa izpišemo tudi čas s pomočjo modula datetime:

Primer:

import datetime
x = datetime.datetime.now()
print(x)
print("Danasnji datum:", x.strftime('%Y-%m-%d') )
print("Leto:", x.year)
print("Mesec:", x.month)
print("Dan:", x.day)
print("Ura:", x.hour)
print("Minuta:", x.minute)


Ta programček bi izpisal trenutni čas v naslednji obliki:

2019-01-23 10:30:16.189659
Danasnji datum: 2019-01-23
Leto: 2019
Mesec: 1
Dan: 23
Ura: 10
Minuta: 30

Prva vrstica kaže izpis v datuma in časa v kompaktni obliki:

Tako dobimo leto, mesec, dan, uro, minute, sekunde in mikrosekunde trenutnega časa

V vaslednjih vrsticah tega primera pa vidimo bolj pregleden izpis leta, meseca, dneva...


Koledar meseca

To omogoča modul calendar, ki ponuja več metod za delo s koledarji. Poglejmo si preprost program:

import calendar
koledar = calendar.month(2016, 6)
print("Koledar za junij 2016 je:")
print (koledar)


Dobili bi naslednji izpis:

Koledar za junij 2016 je:
     June 2016
Mo Tu We Th Fr Sa Su
       1  2  3  4  5
6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30


Tvorba objektov date (datum)

Na voljo imamo konstruktor, ki omogoča tvorbo objekta date z danim leto, mesecem in dnevom:

Primer takega konstruktorja:

import datetime
x = datetime.datetime(2020, 5, 17)
print(x)


S konstruktorjem datetime() bi lahko podali tudi uro, minuto, sekundo, mikrosekundo in časovni pas. Vendar so ti parametri opcijski in jih lahko opustimo. Privzeto vrednost imajo enako 0, za časovni pas pa je privzeta vrednost None.

Objekt Timedelta

Uporabljamo ga za predstavitev trajanja, torej za razliko med dvema datuma ali časoma.  Pri tem uporabljamo naslednjo sintakso

datetime.timedelta([days, [,seconds [,microseconds [,milliseconds [, minutes [,hours [,weeks]]]]]])

V zgornjem scenariju so vsi argumenti opcijski. Njihova privzeta vrednost je 0.

Primer uporabe:

Naslednji program bo vsako sekudno izpisal besedico "zbudil sem se" (vmes pa bo spal). Po 10 sekundah bo programa konec.  Kaj takega pride v poštev pri kakšnih časovno omejenih igricah :)

import datetime, time
then = datetime.datetime.now() + datetime.timedelta(seconds=10)
while then > datetime.datetime.now():
    print ('Zbudil sem se')
    time.sleep(1)



Metoda  strftime()

Objekt datetime ima  še metodo strftime() za oblikovanje (formatiranje) objektov date v berljive nize.

Ta metoda ima en parameter, ki definira format vrnjenega niza:

Primer

import datetime
x = datetime.datetime(2018, 6, 1)

print(x.strftime("%B")) # izpis meseca


In izpis, ki bi ga dobili:

June

Spodnja tabela prikazuje možne kode formata:

Navodilo  DOpis Primer
%a Dan v tednu, kratka verzija Wed
%A Dan v tednu, daljša verzija Wednesday
%w Dan v tednu kot številka 0-6, 0 je nedelja 3
%d Dan v mesecu 01-31 31
%b Ime meseca, krajša verzija Dec
%B Ime meseca, daljša verzija December
%m Mesec kot številka 01-12 12
%y Leto, krajša verzija, brez stoletja 18
%Y Leto, daljša verzija 2018
%H Ura 00-23 17
%I Ura 00-12 05
%p AM/PM PM
%M Minute 00-59 41
%S Sekunde 00-59 08
%f Mikrosekunde 000000-999999 548513
%z UTC odmik +0100
%Z Časovni pas UCT
%j Day number of year 001-366 365
%U Številka tedna v letu, Nedelja kot prvi dan v tednu, 00-53 52
%W Številka tedna v letu, Ponedeljek kot prvi dan tedna, 00-53 52
%c Lokalna verzija datuma in časa Mon Dec 31 17:41:00 2018
%x Lokalna verzija datuma 12/31/18
%X Lokalna verzija časa 17:41:00
%% Znak % %