Daty i godziny w Pythonie nie są osobnym typem danych. Ale Python posiada wbudowany moduł do obsługi dat i godzin - DateTime.
Moduł DateTime zawiera klasy, które zawierają szereg metod obsługujących daty, godziny i przedziały czasowe, ogólnie służa do manipulowania datą i godziną.
Możemy użyć funkcji dir() , aby uzyskać listę zawierającą wszystkie atrybuty modułu:
Przykład:
import datetime
print(dir(datetime))
#wynik
['MAXYEAR', 'MINYEAR', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'date', 'datetime', 'datetime_CAPI', 'sys', 'time', 'timedelta', 'timezone', 'tzinfo']
Spośród wszystkich wywołanych w funkcji dir() atrybutów modułu datetime, najczęściej używanymi są:
klasa
datetime łączy informacje o dacie i godzinie.
klasa
date zawiera tylko informacje o dacie (rok, miesiąc, dzień).
klasa
time odnosi się do czasu niezależnego od dnia (godzina, minuta, sekunda, mikrosekunda).
klasa
timedelta reprezentuje różnicę między dwiema datami lub godzinami.
klasa
tzinfo – abstrakcyjna klasa do manipulowania informacjami o strefie czasowej.
Przykłady pisania kodu w poszczególnych klasach modułu 'datetime'
klasa datetime
Przykład 1: klasa 'datetime' w module datetime:
import datetime
datetime.datetime.now()
datetime.datetime(2023, 2, 17, 9, 48, 22, 774435) #bieżąca data i godzina
klasa date
Przykład 1: klasa 'date' w module datetime:
from datetime import date
x=date(2023,2,17) utworzenie zmiennej x i nadanie jej wartości
print(x)
2023-02-17 #wynik
x.day
17 #wynik
x.month
2 #wynik
x.year
2023 #wynik
x.max
datetime.date(9999, 12, 31) #wynik
x.min
datetime.date(1, 1, 1) #wynik
Jeszcze jeden przykład, tym razem z wykorzystaniem wbudowanej metody 'today' w klasie 'date' modułu datetime:
Przykład 2
import datetime
x=datetime.date.today()
print(x)
2023-02-17 #wynik - aktualna data lokalna
Przykład z wykorzystaniem wbudowanej metody 'fromtimestamp' w klasie 'date' modułu datetime.
Metoda fromtimestamp() zwraca datę odpowiadającą określonemu znacznikowi czasu. Ten znacznik czasu obejmuje zakres od roku 1970 do roku 2038.
W argumentach metody fromtimestamp() ustawiamy ilość sekund, które odmierzają czas od znacznika czasu tj. 1970 r.do zwróconego przez metodę znacznika czasu.
Przykład 3
from datetime import date
x=date.fromtimestamp(1357463585)
print(x)
2013-01-06 #wynik - metoda zwróciła datę od 1970-01-01 odliczając liczbę sekund podaną w argumencie metody
klasa time
Klasa time w module datetime pozwala uzyskać aktualny czas a także pozwala uzyskać dostęp do poszczególnych składników obiektu czasu za pomocą odpowiednich atrybutów.
W ten sposób można osobno uzyskać dostęp do bieżącej godziny, minuty, sekundy i mikrosekundy.
Atrybutami klasy time są sekunda, minuta, godzina, mikrosekunda itp.
Za pomocą obiektu czasu możemy przedstawić lokalną porę dnia:
Przykład 1
from datetime import time
x1=time()
print(x1)
00:00:00 #wynik
x2=time(20,36,34,345)
print(x2)
20:36:34.000345 #wynik
Wprzykładzie powyżej x1 i x2 są obiektami klasy time a time() jest konstruktorem klasy time.
W następnym przykładzie uzyskamy dostęp do poszczególnych atrybutów klasy time:
Przykład 2
from datetime import time
x=time(17,2,30)
x.hour
17 #wynik
x.minute
2 #wynik
x.second
30 #wynik
klasa timedelta
Klasa timedelta służy do obliczania różnic oraz mierzenia czasu trwania między dwiema datami i godzinami.
Wynik może być dodatni lub ujemny.
Atrybutami klasy timedelta są: dni, tygodnie, godziny, minuty, sekundy, mikrosekundy, milisekundy.
Przykład 1
from datetime import timedelta
x=timedelta(days=30, hours=20, minutes=223)
y=timedelta(hours=224, minutes=674, seconds=6685)
z=x-y
print(z)
21 days, 2:37:35 #wynik
W obiekcie timedelta można uzyskać całkowitą liczbę sekund:
Przykład 1
from datetime import timedelta
x=timedelta(days=16000)
print(timedelta.total_seconds(x))
1382400000.0 #wynik
klasa tzinfo
Strefy czasowe na świecie definiowane są przesunięciami względem czasu UTC w zakresie od UTC-12:00 do UTC+14:00. Pythonie klasa tzinfo przechowuje informacje o strefach czasowych.
Klasa tzinfo w module datetime jest klasą abstrakcyjną, w związku z tym nie przyjmuje żadnych parametrów, nic nie zwraca, i żeby skorzystać z tej klasy, trzeba wszystkie metody abstrakcyjne zaimplementować,
instancja tej klasy nie powinna być tworzona bezpośrednio.
Instancja klasy tzinfo może zostać przekazana do konstruktorów obiektów klas datetime i time. Obiekty klas datetime i time postrzegają swoje atrybuty jako czas lokalny, a obiekt tzinfo obsługuje metody
ujawniające przesunięcie czasu lokalnego w stosunku do UTC, nazwę strefy czasowej i przesunięcie DST, a wszystko to w stosunku do przekazanego im obiektu daty lub czasu.
Klasa tzinfo zawiera 4 metody:
- utcoffset(dt), 'dt' jest obiektem modułu datetime. Metoda ta zwraca obiekt reprezentujący przesunięcie czasu lokalnego względem UTC. Jeśli czas lokalny jest na wschód od UTC, jest dodatni
a jeśli jest na zachód od UTC, jest ujemny;
- dst(dt)- zwraca obiekt reprezentujący czas letni lub zmianę czasu letniego. Jeśli informacje o czasie letnim nie są znane, zwraca None;
- tzname(dt) - zwraca nazwę strefy czasowej powiązanej z dt obiektem jako łańcuch znaków;
- fromutc(dt) - Zwraca nazwę strefy czasowej powiązanej z dt obiektem jako łańcuch znaków.
Tworzenie obiektów w module datetime
W Pythonie można tworzyć obiekty datetime zawierające dowolną wiarygodną datę i godzinę od roku 1 aż do roku 9999.
Przykład 1
import datetime
x=date(2023,2,19)
y=time(9,38,20)
print(x)
2023-02-19 #wynik
print(y)
09:38:20 #wynik
Inny przykład, wykorzystując klasę 'date' i tworząc dwa obiekty, z przypisaniem do jednego dzisiejszej daty i do drugiego daty naszych urodzin, możemy określić, ile dni minęło od naszych urodzin:
Przykład 1
import datetime
x=date(2023,2,19)
y=date(1982,4,4)
z=x-y
print(z)
14931 days, 0:00:00 #wynik
Formatowanie dat i godzin
Domyślny format dat i godzin w module datetime to „RRRR-MM-DD HH:MM:SS”.
Dzięki metodzie strftime() możemy zapisać datę i czas w dowolnym formacie, uzyskując zapis bardziej czytelny.
Metoda strftime() przyjmuje jeden parametr.
Przykład 1
import datetime
x=time(21,21,20)
print(x)
21:21:20 #wynik
x.strftime("%H")
'21' #wynik
Główne kody formatowania:
%d :Dzień miesiąca w zapisie dziesiętnym z wypełnionym zerem.
%m :Miesiąc w notacji dziesiętnej z wypełnionym zerem.
%y :Dwie ostatnie cyfry roku w notacji dziesiętnej z wypełnieniem zerowym.
%Y :Cztery cyfry roku w zapisie dziesiętnym z wypełnionym zerem.
%H :W przypadku wyrażenia w notacji dziesiętnej z wypełnionym zerem (notacja 24-godzinna)
%I :W przypadku wyrażenia w notacji dziesiętnej z wypełnionym zerem (notacja 12-godzinna)
%M :Dla notacji dziesiętnej z wypełnionym zerem.
%S :Sekundy w notacji dziesiętnej z wypełnionym zerem.
%f :Mikrosekundy (6 cyfr) w zapisie dziesiętnym z wypełnionym 0.
%A :Nazwa dnia tygodnia dla danego locale
%a :Nazwa dnia dla lokalizacji (forma skrócona)
%B :Nazwa miesiąca lokalnego
%b :Nazwa miesiąca lokalnego (w formie skróconej)
%j :Dzień roku w zapisie dziesiętnym z wypełnieniem zerowym.
%U :Numer tygodnia w roku w zapisie dziesiętnym z wypełnieniem zerowym (tydzień zaczyna się w niedzielę)
%W :Numer tygodnia w roku w zapisie dziesiętnym z wypełnieniem zerowym (tydzień zaczyna się w poniedziałek)