Odcinek 11/15 – Daty i czas w Pythonie

foto kurs pythona odcinek 11

Cel: po tym rozdziale:

  • odczytasz dzisiejszą datę i godzinę,
  • sformatujesz je do ładnego tekstu,
  • policzysz różnicę między datami,
  • dodasz lub odejmiesz dni i godziny,
  • poznasz strefy czasowe i unikniesz typowych wpadek.

1) Podstawowe klocki: date, time, datetime

Python ma trzy typy obiektów do pracy z czasem:

TypCo przechowuje
datesamą datę (rok, miesiąc, dzień)
timesamą godzinę (godziny, minuty, sekundy)
datetimedatę i godzinę razem
from datetime import date, time, datetime

dzis = date.today()
print(dzis)   # np. 2025-09-11

teraz = datetime.now()
print(teraz)  # np. 2025-09-11 15:42:03.123456

Chcesz złożyć konkretny moment z daty i godziny?

wigilia = date(2025, 12, 24)
godzina = time(18, 30)
spotkanie = datetime.combine(wigilia, godzina)
print(spotkanie)  # 2025-12-24 18:30:00

2) Ładne wyświetlanie i wczytywanie – strftime i strptime

  • strftime: obiekt ➜ napis
  • strptime: napis ➜ obiekt

Najczęściej używane kody:

  • %d – dzień (01-31)
  • %m – miesiąc (01-12)
  • %Y – pełny rok (np. 2025)
  • %H:%M – godzina i minuty w 24h
  • %A – nazwa dnia tygodnia
from datetime import datetime

teraz = datetime.now()
print(teraz.strftime("%d.%m.%Y, %H:%M"))  # np. 11.09.2025, 15:42

dt = datetime.strptime("31.12.2025 23:59", "%d.%m.%Y %H:%M")
print(dt)  # 2025-12-31 23:59:00

💡 Uwaga na częste pomyłki:

  • %m to miesiąc, %M to minuty.
  • %H to 24-godziny, %I to 12-godziny (z %p dla AM/PM).

3) Dodawanie, odejmowanie i różnice – timedelta

Do przesuwania dat i liczenia różnic używamy timedelta.

from datetime import datetime, timedelta

start = datetime.strptime("01.10.2025 09:00", "%d.%m.%Y %H:%M")
deadline = start + timedelta(days=7)  # +7 dni
print(deadline.strftime("%d.%m.%Y %H:%M"))  # 08.10.2025 09:00

roznica = deadline - start
print(roznica.days)          # 7
print(roznica.total_seconds())  # 604800.0

Działa też dla samych dat:

from datetime import date, timedelta

dzis = date.today()
za_30_dni = dzis + timedelta(days=30)
print(za_30_dni)

4) Który to dzień tygodnia?

from datetime import date

d = date(2025, 9, 11)
print(d.weekday())     # 0=pon, 6=niedz
print(d.isoweekday())  # 1=pon, 7=niedz

# Funkcja: najbliższy poniedziałek
from datetime import timedelta
def najblizszy_poniedzialek(d):
    return d + timedelta(days=(7 - d.weekday()) % 7)

print(najblizszy_poniedzialek(d))

5) Czekanie i mierzenie czasu – moduł time

import time

start = time.perf_counter()
time.sleep(1.5)  # pauza ~1.5 s
elapsed = time.perf_counter() - start
print(f"Minęło: {elapsed:.3f} s")

Przydatne do testów wydajności lub odliczania.


6) Strefy czasowe – to samo „teraz” w różnych miejscach

Domyślnie datetime nie wie, w jakiej strefie jest czas.
Lepsze są tzw. świadome daty z biblioteką zoneinfo.

from datetime import datetime
from zoneinfo import ZoneInfo

warszawa = ZoneInfo("Europe/Warsaw")
now_waw = datetime.now(warszawa)
print(now_waw)  # 2025-09-11 15:42:03+02:00

now_ny = now_waw.astimezone(ZoneInfo("America/New_York"))
print(now_ny)   # ten sam moment w NY

💡 Wskazówka:

  • Do obliczeń najlepiej trzymaj czas w UTC,
  • A dopiero przy wyświetlaniu zamieniaj na lokalną strefę.
utc = ZoneInfo("UTC")
teraz_utc = datetime.now(utc)
print(teraz_utc.isoformat())

7) Standard ISO 8601 – uniwersalny zapis

Python łatwo zapisuje daty w standardzie ISO 8601:

from datetime import datetime
from zoneinfo import ZoneInfo

dt = datetime(2025, 9, 11, 15, 30, tzinfo=ZoneInfo("Europe/Warsaw"))
print(dt.isoformat())  # 2025-09-11T15:30:00+02:00

odczytany = datetime.fromisoformat("2025-09-11T15:30:00+02:00")
print(odczytany)

8) Małe, praktyczne przykłady

A) Ile dni do Świąt?

from datetime import date

def dni_do(rok, miesiac, dzien):
    return (date(rok, miesiac, dzien) - date.today()).days

print("Do Świąt:", dni_do(2025, 12, 24), "dni")

B) Spotkanie jutro o 9:00 (ze strefą)

from datetime import datetime, time, timedelta
from zoneinfo import ZoneInfo

tz = ZoneInfo("Europe/Warsaw")
jutro_9 = datetime.combine((datetime.now(tz) + timedelta(days=1)).date(), time(9, 0), tz)
print(jutro_9.isoformat())

C) Stempel czasu do logów

from datetime import datetime, timezone
def stempel():
    return datetime.now(timezone.utc).isoformat()

print(stempel())

9) Typowe wpadki i jak ich uniknąć

ProblemDlaczegoRada
Naiwny datetimebrak strefy czasowejzawsze używaj tzinfo i trzymaj w UTC
%m vs %Mmiesiąc ≠ minutypamiętaj: m – miesiąc, M – minuty
„30 dni = miesiąc”miesiące mają 28–31 dniprzy prawdziwych miesiącach użyj biblioteki dateutil
Zmiana czasu (DST)przesunięcia godzin w marcu/październikutrzymaj dane w UTC, na końcu konwertuj

10) Zadania do samodzielnego zrobienia

  1. Program, który pokazuje ile dni zostało do Twoich urodzin.
  2. Harmonogram spotkań: zapisz w pliku daty i godziny, a potem odczytaj i policz, które spotkanie jest najbliżej.
  3. Licznik czasu: podaj datę początkową i zobacz, ile sekund minęło.
  4. Automatyczny stempel logowania w formacie ISO 8601.
  5. Funkcja, która przyjmuje datę i zwraca dzień tygodnia po polsku.

Co zabierasz z odcinka 11?

  • Umiesz pobrać i wyświetlić bieżącą datę i godzinę.
  • Wiesz, jak formatować i parsować daty i godziny.
  • Potrafisz dodawać/odejmować dni i godziny oraz liczyć różnice.
  • Znasz podstawy stref czasowych i zapis ISO 8601.
  • Umiesz tworzyć praktyczne skrypty: liczenie dni do wydarzenia, stempel logów, harmonogramy.