Roberto Montaruli
2007-10-10 18:35:31 UTC
Gente, mi serve un consiglio o un suggerimento.
Ho trovato una imprecisione in una procedura che in determinate
circostanze sbaglia a calcolare l'ora.
Ho una tabella di log: ogni record contiene un campo col valore
dell'orario in cui e' stato scritto.
Solo che questo campo contiene la data e l'ora in formato universale
(numero di secondi trascorsi dal 1 gennaio 1970) riferito al meridiano
di greenwich, quindi per trasformare il dato nel fuso orario italiano
devo aggiungere 1 ora o 2 ore a seconda se siamo in regime di ora legale
o ora solare.
Questa procedura, che opera tale trasformazione, commette un errore
formale piuttosto grave: per sapere quanto aggiungere per trasformare
l'orario, interroga il sistema operativo, il quale correttamente
restituisce +1 o +2 a seconda del regime di orario *attuale*.
E questo funziona se si trasformano i valori del giorno corrente.
Il problema e' che se io vado a recuperare un record vecchio, e voglio
convertire il campo di orario, la procedura mi aggiunge +1 o +2 in base
al regime *attuale* e non in base a quello del momento in cui si
riferisce il record.
Si accettano suggerimenti su come procedere.
Sono consentite tutte le funzioni standard di un linguaggio procedurale
di alto livello.
E' nota la regola che il cambio di ora avviene l'ultima domenica di
marzo e l'ultima di ottobre.
Non si possono effettuare chiamate al sistema operativo.
Non si puo' usare una tabella di appoggio.
Le date risalenti a quando il cambio dell'ora legale era in settembre
invece che in ottobre non contano perche' non ci sono dati di
quell'epoca, quindi possiamo ignorarle.
Non e' necessario prendere in considerazione l'eventualita' che la
regola dell'ora legale possa cambiare in futuro.
La funzione deve ricevere come argomento un longint col numero di
secondi dalla mezzanotte del 1/1/70 e restituire un datetime (o una
stringa con la data e l'ora)
Ho trovato una imprecisione in una procedura che in determinate
circostanze sbaglia a calcolare l'ora.
Ho una tabella di log: ogni record contiene un campo col valore
dell'orario in cui e' stato scritto.
Solo che questo campo contiene la data e l'ora in formato universale
(numero di secondi trascorsi dal 1 gennaio 1970) riferito al meridiano
di greenwich, quindi per trasformare il dato nel fuso orario italiano
devo aggiungere 1 ora o 2 ore a seconda se siamo in regime di ora legale
o ora solare.
Questa procedura, che opera tale trasformazione, commette un errore
formale piuttosto grave: per sapere quanto aggiungere per trasformare
l'orario, interroga il sistema operativo, il quale correttamente
restituisce +1 o +2 a seconda del regime di orario *attuale*.
E questo funziona se si trasformano i valori del giorno corrente.
Il problema e' che se io vado a recuperare un record vecchio, e voglio
convertire il campo di orario, la procedura mi aggiunge +1 o +2 in base
al regime *attuale* e non in base a quello del momento in cui si
riferisce il record.
Si accettano suggerimenti su come procedere.
Sono consentite tutte le funzioni standard di un linguaggio procedurale
di alto livello.
E' nota la regola che il cambio di ora avviene l'ultima domenica di
marzo e l'ultima di ottobre.
Non si possono effettuare chiamate al sistema operativo.
Non si puo' usare una tabella di appoggio.
Le date risalenti a quando il cambio dell'ora legale era in settembre
invece che in ottobre non contano perche' non ci sono dati di
quell'epoca, quindi possiamo ignorarle.
Non e' necessario prendere in considerazione l'eventualita' che la
regola dell'ora legale possa cambiare in futuro.
La funzione deve ricevere come argomento un longint col numero di
secondi dalla mezzanotte del 1/1/70 e restituire un datetime (o una
stringa con la data e l'ora)