MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Operații cu date

Formatarea datelor și timpului

Pentru formatarea obiectelor de tip date și time, în ambele clase este prevăzută metoda strftime(format). Această metodă primește un singur parametru, care indică formatul în care trebuie convertită data sau ora.

Pentru definirea formatului, putem folosi unul dintre următoarele coduri de formatare:

  • %a: abrevierea zilei săptămânii. De exemplu, Wed pentru Wednesday (implicit, se folosesc denumirile în limba engleză)
  • %A: denumirea completă a zilei săptămânii, de exemplu, Wednesday
  • %b: abrevierea denumirii lunii. De exemplu, Oct (abreviere pentru October)
  • %B: denumirea completă a lunii, de exemplu, October
  • %d: ziua lunii, completată cu zero, de exemplu, 01
  • %m: numărul lunii, completat cu zero, de exemplu, 05
  • %y: anul reprezentat prin două cifre
  • %Y: anul reprezentat prin patru cifre
  • %H: ora în format de 24 de ore, de exemplu, 13
  • %I: ora în format de 12 ore, de exemplu, 01
  • %M: minutul
  • %S: secunda
  • %f: microsecunda
  • %p: indicator AM/PM
  • %c: data și ora formatate conform localei curente
  • %x: data formatată conform localei curente
  • %X: ora formatată conform localei curente

Exemplu de utilizare a diferitelor formate:

from datetime import datetime

now = datetime.now()
print(now.strftime("%Y-%m-%d"))             # 2017-05-03
print(now.strftime("%d/%m/%Y"))             # 03/05/2017
print(now.strftime("%d/%m/%y"))             # 03/05/17
print(now.strftime("%d %B %Y (%A)"))        # 03 May 2017 (Wednesday)
print(now.strftime("%d/%m/%y %I:%M %p"))    # 03/05/17 01:36 PM

Implicit, la afișarea denumirilor lunilor și zilelor săptămânii, se folosesc denumirile în limba engleză. Dacă dorim să utilizăm denumirile în funcție de locala curentă, putem seta localizarea cu ajutorul modulului locale:

from datetime import datetime
import locale

locale.setlocale(locale.LC_ALL, "")

now = datetime.now()
print(now.strftime("%d %B %Y (%A)"))        # 03 Mai 2017 (miercuri)

Adunarea și scăderea datelor și timpului

Adesea, în lucrul cu datele, apare necesitatea de a adăuga la o dată un anumit interval de timp sau, dimpotrivă, de a scădea o anumită perioadă. În mod special pentru aceste operații, în modulul datetime este definită clasa timedelta. Această clasă definește un anumit interval de timp.

Pentru a defini un interval de timp, putem folosi constructorul timedelta:

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

În constructor, putem transmite succesiv zile, secunde, microsecunde, milisecunde, minute, ore și săptămâni.

Exemplu de definire a unor intervale de timp:

from datetime import timedelta

three_hours = timedelta(hours=3)
print(three_hours)  # 3:00:00

three_hours_thirty_minutes = timedelta(hours=3, minutes=30)
print(three_hours_thirty_minutes)  # 3:30:00

two_days = timedelta(days=2)
print(two_days)  # 2 days, 0:00:00

two_days_three_hours_thirty_minutes = timedelta(days=2, hours=3, minutes=30)
print(two_days_three_hours_thirty_minutes)  # 2 days, 3:30:00

Folosind timedelta, putem aduna sau scădea date. De exemplu, să obținem data care va fi peste două zile:

from datetime import timedelta, datetime

now = datetime.now()
print(now)  # 2017-05-03 17:46:44.558754

two_days = timedelta(days=2)
in_two_days = now + two_days
print(in_two_days)  # 2017-05-05 17:46:44.558754

Sau să aflăm cât timp a trecut cu 10 ore și 15 minute în urmă, adică să scădem din timpul curent 10 ore și 15 minute:

from datetime import timedelta, datetime

now = datetime.now()
till_ten_hours_fifteen_minutes = now - timedelta(hours=10, minutes=15)
print(till_ten_hours_fifteen_minutes)

Proprietățile clasei timedelta

Clasa timedelta are câteva proprietăți prin care putem obține intervalul de timp:

  • days: returnează numărul de zile
  • seconds: returnează numărul de secunde
  • microseconds: returnează numărul de microsecunde

În plus, metoda total_seconds() returnează numărul total de secunde, care include zilele, secundele și microsecundele.

De exemplu, să aflăm care este intervalul de timp între două date:

from datetime import timedelta, datetime

now = datetime.now()
twenty_two_may = datetime(2017, 5, 22)
period = twenty_two_may - now
print("{} zile  {} secunde   {} microsecunde".format(period.days, period.seconds, period.microseconds))
# 18 zile  17537 secunde   72765 microsecunde

print("Total: {} secunde".format(period.total_seconds()))
# Total: 1572737.072765 secunde

Compararea datelor

Asemenea șirurilor și numerelor, datele pot fi comparate folosind operatorii de comparație standard:

from datetime import datetime

now = datetime.now()
deadline = datetime(2017, 5, 22)

if now > deadline:
   print("Termenul limită pentru proiect a trecut")
elif now.day == deadline.day and now.month == deadline.month and now.year == deadline.year:
   print("Termenul limită pentru proiect este astăzi")
else:
   period = deadline - now
   print("Au rămas {} zile".format(period.days))

Aceste funcții oferă flexibilitate în gestionarea și manipularea datelor și timpului în Python, permițând efectuarea de operații complexe cu ușurință.

← Lecția anterioară