time - Funzioni per la manipolazione del tempo

Scopo Funzioni per la manipolazione del tempo
Versione Python 1.4 o precedente

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.

Nel documento originale, e lasciati invariati in questo documento, si parla di wall clock time e di processor clock time; mentre il primo si riferisce all'umana percezione del passaggio di tempo dalla partenza al completamento di un compito, il secondo fa riferimento al tempo effettivo impiegato dalla CPU per svolgere un certo compito. Visto che la CPU esegue anche altri compiti contemporanemente e deve comunque attendere altri processi o risposte dall'hardware.Il wall clock time è in genere maggiore rispetto al processor clock time. (n.d.t.)

Wall Clock Time

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

Processor Clock Time

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à.

struct_time

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

Analizzare e Formattare il Tempo

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

Lavorare con i Fusi Orari

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

Vedere anche:

time
La documentazione della libreria standard per questo modulo.
datetime
Il modulo datetime include altre classi per eseguire calcoli con date ed ora.
calendar
Lavora con funzioni di data a più alto livello per produrre calendari o calcolare eventi ricorrenti.