[Python] Gestione delle date

Daniele Varrazzo piro a develer.com
Mer 15 Ott 2014 16:12:12 CEST


On 2014-10-15 14:26, Riccardo Brazzale wrote:
> Ciao a tutti,
> 
> mi trovo a dover gestire una data, proveniente da un db mysql, nel 
> formato
> windows seriale.
> 
> Come esempio trovo che:
> 
> 39690 = 30/08/08
> 40849 = 02/11/11
> 
> ora:
> 
> Python 2.7.6 (default, Mar 22 2014, 22:59:56)
> [GCC 4.8.2] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
>>>> from datetime import datetime
>>>> dt = datetime.fromordinal(39690)
>>>> datetime.isoformat(dt)
> '0109-09-01T00:00:00'
>>>> dt = datetime.fromordinal(40849)
>>>> datetime.isoformat(dt)
> '0112-11-03T00:00:00'
>>>> 
> 
> 
> Qualcosa non mi torna perché evidentemente canno la gestione.
> 
> Qual è il procedimento corretto?

Aggiungi seicentonovantatremilacinquecentonovantaquattro giorni.

La "data seriale" di windows evidentemente usa uno zero diverso da 
quello di Python:

     >>> import datetime
     >>> datetime.date(2008,8,30).toordinal()
     733284

Puoi verificare che le due epoche, quella di Python e quella di Windows 
sono costanti, partendo dai tuoi due esempi:

     >>> datetime.date(2008,8,30).toordinal() - 39690
     693594

     >>> datetime.date(2011,11,2).toordinal() - 40849
     693594

Quindi basta aggiungere questo offset:

     >>> def date_from_winserial(n):
     ... return datetime.date.fromordinal(n + 693594)

     >>> date_from_winserial(39690)
     datetime.date(2008, 8, 30)

     >>> date_from_winserial(40849)
     datetime.date(2011, 11, 2)

Curiosita': quale zero usa windows?

     >>> date_from_winserial(0)
     datetime.date(1899, 12, 30)

E che data e'? Con questa data credo che 1 corrisponda al 1/1/1900 se si 
include il bug di considerare il 1900 come un anno bisestile (che 
semplifica l'algoritmo di ricerca degli anni bisestili a "anno & 3 == 0" 
e funziona bene dal 1901 al 2099). Le date dal 1/1 al 27/2/1900 sono 
sbagliate ma le altre vanno bene, che e' un'approssimazione sufficiente 
per gli standard pragmatici di Microsoft e le ristrettezze dell'hardware 
per cui le prime versioni di Excel erano scritte. Archeologia 
informatica...

-- Daniele



Maggiori informazioni sulla lista Python