Dwa podstawowe typy: date i datetime
Moduł datetime daje cztery rzeczy, które warto znać: date, time, datetime i timedelta. Trzy pierwsze to to, na co wskazują nazwy, a czwarta to odcinek czasu.
date reprezentuje dzień (rok, miesiąc, dzień) bez zegara. datetime to data plus godzina. Jeśli zegar nie jest potrzebny, date jest schludniejszym wyborem.
Tworzenie konkretnych dat
Utwórz je bezpośrednio:
Argumenty to year, month, day dla date i maksymalnie year, month, day, hour, minute, second, microsecond dla datetime.
Odczyt pól
Każdy obiekt date/datetime ma atrybuty:
isoformat() to twój sprzymierzeniec przy wyjściu czytelnym dla maszyn: daje coś w stylu "2026-04-20T09:30:15", co inne systemy mogą sparsować bez dwuznaczności.
Formatowanie przez strftime
Dla wyjścia czytelnego dla ludzi .strftime(fmt) zamienia date albo datetime w sformatowany napis:
Kody formatu, które najczęściej warto pamiętać:
%Y: rok czterocyfrowy (2026)%m: numer miesiąca z zerem wiodącym (04)%d: dzień miesiąca z zerem wiodącym (20)%H/%I: godzina w formacie 24- lub 12-godzinnym%M: minuta%S: sekunda%A/%a: nazwa dnia tygodnia pełna / skrócona (Monday / Mon)%B/%b: nazwa miesiąca pełna / skrócona (April / Apr)%p: AM/PM
Nie musisz ich zapamiętywać: zapisz sobie ściągę i zaglądaj do niej, gdy trzeba.
Parsowanie przez strptime
W drugą stronę: weź napis o znanym kształcie i zamień go na datetime:
Napis formatu musi dokładnie pasować do wejścia. Jeśli nie pasuje, strptime zgłasza ValueError.
Dla napisów ISO-8601 (standard czytelny dla maszyn) współczesny Python ma prostszy skrót:
Jeśli masz do czynienia z przypadkowymi formatami, zewnętrzny pakiet dateutil (pip install python-dateutil) ma wyrozumiałe parser.parse(), które rozsądnie zgaduje.
Arytmetyka z timedelta
Do obliczeń na datach używaj timedelta jako różnicy albo przesunięcia:
Argumenty timedelta: days, seconds, microseconds, milliseconds, minutes, hours, weeks. Nie ma months ani years, bo miesiące mają różną długość. Do obliczeń na miesiącach i latach użyj dateutil.relativedelta:
from dateutil.relativedelta import relativedelta
from datetime import date
today = date.today()
next_quarter = today + relativedelta(months=3)
print(next_quarter)
Strefy czasowe: naiwne i świadome
datetime bez informacji o strefie czasowej jest naiwny (naive): Python nie wie, jaką strefę reprezentuje. Obliczenia na naiwnych datach są w porządku, dopóki pozostajesz w jednej logicznej strefie. Kłopoty zaczynają się w chwili, gdy spotykają się dane z różnych stref.
Świadomy (aware) datetime niesie ze sobą informację o strefie. Dołącz strefę jawnie:
Python 3.9 dodał moduł zoneinfo do nazwanych stref czasowych (korzysta z systemowej bazy IANA):
Konwertuj między strefami przez .astimezone():
Zasada, którą warto zapamiętać: przechowuj daty w UTC, a na strefy lokalne zamieniaj je dopiero przy wyświetlaniu. Ten jeden nawyk zapobiega większości błędów ze strefami czasowymi.
Znaczniki czasu
Uniksowy znacznik czasu (timestamp) to liczba sekund od 1970-01-01 UTC. Python łatwo go konwertuje:
Znaczniki czasu przydają się do porównań, sortowania i wymiany danych z innymi systemami. Do wyjścia dla ludzi najpierw zamień je z powrotem na datetime.
Mierzenie, ile coś trwa
Do szybkich pomiarów odejmij dwa obiekty datetime:
Do poważniejszych pomiarów wydajności użyj time.perf_counter(): ma rozdzielczość poniżej mikrosekundy i jest odporne na zmiany zegara systemowego. datetime.now() wystarczy do liczb w stylu "ile trwało to wywołanie API".
Wzorce do ponownego użycia
Co zapamiętać
date,datetimeitimedeltapokrywają 90% potrzeb.- ISO-8601 dla maszyn,
strftimedla ludzi. - Przechowuj w UTC, konwertuj przy wyświetlaniu.
- Do nazwanych stref czasowych używaj
zoneinfo. - Do miesięcy i lat sięgaj po
dateutil.relativedelta.
Jeszcze jedno narzędzie do praktycznego zestawu: wyrażenia regularne, zaraz dalej.
Najczęściej zadawane pytania
Jak pobrać aktualną datę i godzinę w Pythonie?
datetime.now() zwraca bieżącą lokalną datę i godzinę. datetime.utcnow() zwraca czas UTC (choć dziś zaleca się datetime.now(timezone.utc), bo utcnow() zwraca naiwny datetime). Jeśli potrzebujesz tylko daty, użyj date.today().
Jak sformatować datę jako napis?
Użyj .strftime(format) z kodami formatu, na przykład %Y-%m-%d dla rok-miesiąc-dzień. Przykład: datetime.now().strftime('%Y-%m-%d %H:%M'). Aby z powrotem sparsować napis, użyj datetime.strptime(text, format) z tymi samymi kodami.
Jak dodać dni do daty w Pythonie?
Użyj timedelta: from datetime import date, timedelta; date.today() + timedelta(days=7). timedelta obsługuje dni, godziny, minuty, sekundy, tygodnie i więcej. Do obliczeń na miesiącach i latach użyj zewnętrznego dateutil.relativedelta, bo timedelta nie zna miesięcy.