Scopo | Funzioni per la manipolazione del tempo |
Versione Python | 1.4 o precedente |
A partire dal 1 gennaio 2021 le versioni 2.x di Python non sono piu' supportate. Ti invito a consultare la corrispondente versione 3.x dell'articolo per il modulo time
Il modulo time espone le funzioni della libreria C per manipolare date e tempo. Visto che è legato all'implementazione C sottostante, alcuni dettagli (tipo l'inizio dell'epoca ed il valore massimo di data supportato) sono specifiche alla piattaforma. Fare riferimento alla documentazione della libreria per più completi dettagli.
Una delle funzioni base del modulo
time
è
time()
, che restituisce il numero di secondi trascorsi dall'inizio dell'epoca sotto forma di valore a virgola mobile.
import time
print 'The time is:', time.time()
Sebbene il valore sia sempre a virgola mobile, la precisione reale dipende dalla piattaforma.
$ python time_time.py L'ora è: 1280161322.19
La rappresentazione a virgola mobile è utile quando si debbono conservare o confrontare date, ma non molto utile per produrre rappresentazioni leggibili dall'uomo. Per una registrazione o stampa del tempo
ctime()
può essere molto più utile.
import time
print "L'ora è :", time.ctime()
later = time.time() + 15
print '15 sec. da adesso:', time.ctime(later)
In questo caso la seconda riga dell'output mostra come usare
ctime()
per formattare un valore di tempo diverso da quello corrente
$ python time_ctime.py L'ora è : Mon Jul 26 18:27:01 2010 15 sec. da adesso: Mon Jul 26 18:27:16 2010
Laddove
time()
restituisce il
wall clock time
,
clock()
ritorna il
processor clock time
. I valori ritornati da
clock()
dovrebbero essere usati per controllare prestazioni, per benchmarcking ecc., visto che essi rappresentatno i valori reali impiegati dal programma, e possono essere più precisi di quelli di
time()
.
(vedere nota)
import hashlib
import time
# Dati da usare per calcolare i checksums md5
data = open(__file__, 'rt').read()
for i in range(5):
h = hashlib.sha1()
print time.ctime(), ': %0.3f %0.3f' % (time.time(), time.clock())
for i in range(100000):
h.update(data)
cksum = h.digest()
In questo esempio il tempo formattato
ctime()
viene stampato assieme ai valori a virgola mobile da
time()
, e
clock()
per ogni iterazione attraverso il ciclo. Se si vuole eseguire l'esempio nel proprio sistema, si potrebbe dover aggiungere più cicli al loop più interno o lavorare con un numero maggiore di dati per vedere realmente la differenza.
$ python time_clock.py Mon Jul 26 18:42:40 2010 : 1280162560.821 0.010 Mon Jul 26 18:42:41 2010 : 1280162561.007 0.170 Mon Jul 26 18:42:41 2010 : 1280162561.185 0.330 Mon Jul 26 18:42:41 2010 : 1280162561.361 0.500 Mon Jul 26 18:42:41 2010 : 1280162561.535 0.670
Tipicamente, il processor clock non scorre se il proprio programma non sta facendo nulla.
import time
for i in range(6, 1, -1):
print '%s %0.2f %0.2f' % (time.ctime(), time.time(), time.clock())
print 'In pausa', i
time.sleep(i)
In questo esempio, il ciclo fa un lavoro minimo, mettendosi in pausa dopo ogni iterazione. Il valore di
time()
aumenta anche quando l'applicazione è in pausa, ma il valore di
clock()
rimane invariato:
$ python time_clock_sleep.py Mon Jul 26 18:48:06 2010 1280162886.03 0.01 In pausa 6 Mon Jul 26 18:48:12 2010 1280162892.04 0.01 In pausa 5 Mon Jul 26 18:48:17 2010 1280162897.04 0.01 In pausa 4 Mon Jul 26 18:48:21 2010 1280162901.05 0.01 In pausa 3 Mon Jul 26 18:48:24 2010 1280162904.05 0.01 In pausa 2
La chiamata di
sleep()
cede il controllo dal thread corrente e gli chiede di attendere fino a che il sistema non esca dalla pausa. Se il proprio programma ha un solo thread, l'applicazione viene effettivamente bloccata e non esegue alcuna attività.
Convervare il tempo come secondi trascorsi puù essere utile in alcune situazioni, ma ci sono volte nelle quali ci deve avere accesso ai singoli campi di una data (anno, mese, ecc.). Il modulo time definisce struct_time per mantenere i valori di data ed ora con i componenti separati in modo da essere facilmente accessibili. Ci sono parecchie funzioni che lavorano con i valori di struct_time invece che con i valori a virgola mobile.
import time
print 'gmtime :', time.gmtime()
print 'localtime:', time.localtime()
print 'mktime :', time.mktime(time.localtime())
print
t = time.localtime()
print 'Giorno del mese:', t.tm_mday
print 'Giorno della settimana:', t.tm_wday
print "Giorno dell'anno:", t.tm_yday
gmtime()
ritorna il tempo corrente
UTC
.
localtime()
ritorna il tempo corrente in base al fuso orario applicato.
mktime()
ottiene una
struct_time
e la converte nella sua rappresentazione a virgola mobile.
$ python time_struct.py gmtime : time.struct_time(tm_year=2010, tm_mon=7, tm_mday=26, tm_hour=16, tm_min=55, tm_sec=42, tm_wday=0, tm_yday=207, tm_isdst=0) localtime: time.struct_time(tm_year=2010, tm_mon=7, tm_mday=26, tm_hour=18, tm_min=55, tm_sec=42, tm_wday=0, tm_yday=207, tm_isdst=1) mktime : 1280163342.0 Giorno del mese: 26 Giorno della settimana: 0 Giorno dell'anno: 207
Le funzioni
strptime()
e
strftime()
convertono tra struct_time e rappresentazioni stringa di valori di tempo. C'è una lunga lista di informazioni disponibile per la formattazione per il supporto di input ed output in stili differenti. L'elenco completo è inserito nella documentazione della libreria per questo modulo.
Questo esempio converte il tempo corrente da una stringa ad una istanza di struct_time , quindi lo riscrive come stringa.
import time
now = time.ctime()
print now
parsed = time.strptime(now)
print parsed
print time.strftime("%a %b %d %H:%M:%S %Y", parsed)
La stringa di output non è esattamente come l'input, visto che il giorno del mese viene prefissato da uno zero.
$ python time_strptime.py Mon Jul 6 19:04:23 2010 time.struct_time(tm_year=2010, tm_mon=7, tm_mday=26, tm_hour=19, tm_min=4, tm_sec=23, tm_wday=0, tm_yday=207, tm_isdst=-1) Mon Jul 06 19:04:23 2010
Le funzioni per determinare il tempo corrente dipendono dall'avere impostato il fuso orario, sia dal proprio programma che usando l'impostazione del fuso orario del sistema. La modifica del fuso orario non modifica l'orario effettivo, ma solo il modo in cui viene rappresentato.
Per modificare il fuso orario, si imposta la variabile di ambiente
TZ
, quindi si chiama
tzset()
. Tramite l/'uso di TZ, si può specificare il fuso orario molto dettagliatamente, fino all'inizio ed alla fine dell'ora legale; è in genere più semplice usare il nome del fuso orario e lasciare che le librerie sottostanti ricavino le altre informazioni.
In questo esempio il programma modifica il fuso orario ad un valore diverso e mostra come le modifiche si ripercuotono sulle altre impostazioni nel modulo time.
import time
import os
def show_zone_info():
print '\tTZ :', os.environ.get('TZ', '(not set)')
print '\ttznome:', time.tzname
print '\tZona : %d (%d)' % (time.timezone, (time.timezone / 3600))
print '\tDST :', time.daylight
print '\tORa :', time.ctime()
print
print 'Predefinito :'
show_zone_info()
for zone in [ 'US/Eastern', 'US/Pacific', 'GMT', 'Europe/Amsterdam' ]:
os.environ['TZ'] = zone
time.tzset()
print zone, ':'
show_zone_info()
Il fuso orario predefinito per l'esecuzione di questo script è Europe/Amsterdam, quindi l'impostazione di TZ a questo valore non ha effetto. ma le altre zone di fuso orario usate modificano il nome della zona, il flag dell'ora legale ed i valori di scostamento per quel fuso orario.
$ python time_timezone.py Predefinito : TZ : (not set) tznome: ('CET', 'CEST') Zona : -3600 (-1) DST : 1 ORa : Mon Jul 26 19:12:35 2010 US/Eastern : TZ : US/Eastern tznome: ('EST', 'EDT') Zona : 18000 (5) DST : 1 ORa : Mon Jul 26 13:12:35 2010 US/Pacific : TZ : US/Pacific tznome: ('PST', 'PDT') Zona : 28800 (8) DST : 1 ORa : Mon Jul 26 10:12:35 2010 GMT : TZ : GMT tznome: ('GMT', 'GMT') Zona : 0 (0) DST : 0 ORa : Mon Jul 26 17:12:35 2010 Europe/Amsterdam : TZ : Europe/Amsterdam tznome: ('CET', 'CEST') Zona : -3600 (-1) DST : 1 ORa : Mon Jul 26 19:12:35 2010