Python versione Bignami - Lavorare con le date

calendar

import calendar

time

def fun():
    start = clock()
    #...
    print "Ci ho messo", clock()-start, "secondi"

datetime

import datetime as dt

date

d = dt.date(anno, mese, giorno)

Gli oggetti date possono essere sommati a un timedelta, sottratti, confrontati con uguaglianze e disuguaglianze.

time

t = dt.time(hour[, minute][, second][, microsecond][, tzinfo])

datetime

d = dt.datetime(year, month, day[, hour][, minute][, second][, microsecond][, tzinfo])

Equivale a datetime.date e datetime.time messi assieme.

Gli oggetti datetime possono essere sommati a un timedelta, sottratti, confrontati con uguaglianze e disuguaglianze.

Gli oggetti datetime si dicono naive se non hanno informazioni sul fuso, e aware se hanno informazioni sul fuso.

Sia per problemi della libreria Python nella gestione dell'ora legale, sia per motivi di efficienza, è bene lavorare sempre e solo con datetime naive contenenti valori in UTC, gestendo i fusi solo quando si leggono valori dall'utente e quando si presentano valori all'utente.

timedelta

td = dt.timedelta([days][, seconds][, microseconds][, milliseconds][, minutes][, hours][, weeks])

Rappresenta un intervallo temporale in giorni, secondo e microsecondi (gli altri valori possono essere usati per convenienza, e vengono convertiti).

La precisione è:

Le operazioni supportate sono addizione, sottrazione, moltiplicazione per un intero, divisione per un intero, opposto (-t), valore assoluto (abs(t)).

pytz

import pytz

pytz permette di lavorare coi fusi orari:

# Elenca le timezone nel database
print "Ci sono %d time zone nel database, di cui %d correntemente in uso:" % (
    len(pytz.all_timezones),
    len(pytz.common_timezones))
for name in pytz.common_timezones:
    print "  ", name

# La timezone UTC e' gia' pronta
utc = pytz.utc

# Crea una time zone
rome = pytz.timezone("Europe/Rome")

# Crea un datetime aware in ora locale
a = rome.localize(dt.datetime(2009, 06, 29, 06, 06))

# Ora corrente in fuso orario locale
a = rome.localize(dt.datetime.now())

# Ma per lavorare con le date, meglio usare utc
b = utc.localize(dt.datetime.utcnow())

# Converte in un altro fuso orario
london = pytz.timezone("Europe/London")
a1 = a.astimezone(london)

# Converte un datetime in UTC
a2 = a.astimezone(utc)

# Crea un datetime naive, in UTC
d1 = dt.datetime.utcnow()

# Converte un datetime aware in un datetime naive in UTC
b = a.astimezone(utc).replace(tzinfo=None)

# ...fa dei conti...
c = b + dt.timedelta(days=30*6)

# Converte di nuovo in fuso orario locale per mostrarlo all'utente, gestendo
# correttamente il passaggio all'ora legale
print "Il risultato e':", utc.localize(c).astimezone(rome)

Per evitare confusione, i datetime naive devono sempre contenere valori UTC.

È importante lavorare sempre in UTC, effettuando conversioni solo quando si leggono o visualizzano date.

Le operazioni tra date devono essere fatte sempre con date aware in UTC, o con date naive (che è bene contengano sempre valori UTC).

Non si possono confrontare oggetti datetime naive con oggetti aware. Per non impazzire, lavorare sempre con datetime naive, contenenti valori in UTC.

Link