Python versione Bignami - Lavorare con le date
calendar
import calendar
calendar.isleap(anno)
restituisce True se l'anno è bisestile.weekday(anno, mese, giorno)
restituisce il giorno della settimana (0 = lunedí, 1 = martedí... 6 = domenica).timegm(tupla di gmtime)
funzione inversa ditime.gmtime()
time
clock()
restituisce il numero di secondi a partire da un momento imprecisato; è floating point ed è utile per vedere il tempo di esecuzione di una funzione:
def fun():
start = clock()
#...
print "Ci ho messo", clock()-start, "secondi"
-
gmtime([secondi])
dato un timestamp Unix, restituisce una tupla che contiene (nel fuso orario UTC):Indice Nome Descrizione 0 tm_year Sempre a 4 cifre 1 tm_mon Da 1 a 12 2 tm_mday Da 1 a 31 3 tm_hour Da 0 a 23 4 tm_min Da 0 a 59 5 tm_sec Da 0 a 59 (60 e 61 per i secondi bisestili) 6 tm_wday Da 0 (lunedí) a 6 (domenica) 7 tm_yday Da 1 a 366 8 tm_isdst 0 = ora solare, 1 = ora legale, -1 = non so
-
localtime([secondi])
dato un timestamp Unix, restituisce una tupla analoga a quella digmtime
, ma in ora locale mktime(tupla stile gmtime)
funzione inversa di localtimesleep(secondi)
ferma l'esecuzione per il dato numero di secondi. Si possono usare numeri floating point:sleep(0.1)
si ferma per un decimo di secondo.-
strftime(format[, tupla stile gmtime])
crea una stringa con la data, secondo il contenuto diformat
:%a Nome del giorno abbreviato, secondo la locale corrente %A Nome del giorno completo, secondo la locale corrente %b Nome del mese abbreviato, secondo la locale corrente %B Nome del mese completo, secondo la locale corrente %c Data e ora rappresentati secondo la locale corrente %d Giorno a due cifre (da 01 a 31) %H Ora a due cifre (da 00 a 23) %I Ora a due cifre (da 01 a 12) %j Giorno dell'anno a 3 cifre (da 001 a 366) %m Mese a due cifre (da 01 a 12) %M Minuto a due cifre (da 00 a 59) %p "AM" o "PM" %S Secondo a due cifre (da 00 a 61) %w Giorno della settimana (da 0 (lunedí) a 6) %x Data abbreviata %X Ora abbreviata %y Anno a due cifre (da 00 a 99) %Y Anno a quattro cifre %Z Nome del fuso orario %% Il carattere '%'
-
strptime(formato, stringa)
funzione inversa di strftime: data una stringa, restituisce una tupla in stile gmtime, leggendo i valori secondo il formato dato time()
timestamp Unix corrente
datetime
import datetime as dt
date
d = dt.date(anno, mese, giorno)
- Anno va da
datetime.MINYEAR
adatetime.MAXYEAR
, senza considerare aggiustamenti di calendario - Mese va da 1 a 12
- Giorno va da 1 al numero di giorni nel mese dato
datetime.today()
restituisce la data corrente
Gli oggetti date
possono essere sommati a un timedelta
, sottratti,
confrontati con uguaglianze e disuguaglianze.
d.replace([year][, month][,day])
restituisce una data uguale ad
, ma sostituendo i valori dati. Esempio:d1 = d.replace(month=5)
d.timetuple()
retituisce la data in una tupla in stile gmtimed.strftime(formato)
analogo atime.strftime
time
t = dt.time(hour[, minute][, second][, microsecond][, tzinfo])
- hour sta tra 0 e 24
- minute sta tra 0 e 60
- second sta tra 0 e 60
- microsecond sta tra 0 e 1000000
-
tzinfo è None o un oggetto di tipo
datetime.tzinfo
-
t.replace([hour][, minute][, second][, microsecond][, tzinfo]) analoga alla
replacedi
datetime.date` t.strftime(formato)
analogo atime.strftime
datetime
d = dt.datetime(year, month, day[, hour][, minute][, second][, microsecond][, tzinfo])
Equivale a datetime.date
e datetime.time
messi assieme.
dt.datetime.now([tz])
restituisce data e ora attuali, in ora locale o nel fuso specificatodt.datetime.utcnow()
restituisce data e ora attuali in UTCdt.datetime.fromtimestamp(ts[, tz])
restituisce data e ora corrispondenti a un timestamp Unix, in ora locale o nel fuso specificatodt.datetime.utcfromtimestamp(ts)
restituisce data e ora corrispondenti a un timestamp Unix, in UTCdt.datetime.combine(date, time)
combina undate
e untime
in undt.datetime
Gli oggetti datetime
possono essere sommati a un timedelta
, sottratti,
confrontati con uguaglianze e disuguaglianze.
d1 = d.date()
restituisce un oggettodate
con la datat = d.time()
restituisce unoggettotime
con l'orad1 = d.replace([year][, month][, day][, hour][, minute][, second][, microsecond][, tzinfo])
analogo alla replace didatetime.date
d.timetuple()
retituisce la data e ora in una tupla in stile gmtimed.strftime(formato)
analogo atime.strftime
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 è:
- microseconds va da 0 a 999999
- seconds va da 0 a 86399 (il numero di secondi in un giorno)
- days va da -999999999 a 999999999
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.