Newsgroup: it.comp.lang.perl
Titolo: Il localtime core del Perl non funziona correttamente dopo il 1980?

Ciao a tutti, una semplice funzione che incrementa i giorni...
--------------------
#! /usr/bin/perl
use Time::Local;
my $data = '01-01-1980';
for(my $i=0;$i<365;$i++){
    print "Data1: $data - ";
    $data = &somma_giorni($data,1);
    print "Data2: $data\n"
}
1;
sub somma_giorni(){
    my($data,$somma)=@_;
    $data_timel = timelocal(0,0,0,substr($data,0,2),(substr($data,3,2)-1),substr($data,6,4));
    # sommo i giorni dell'argomento ai secondi che compongono le 24h
    @new_date=localtime(($data_timel+($somma*86400)));
    # stampo per il debug
    print " [timelocal: $data_timel]-[localtime:
$new_date[3]-$new_date[4]-$new_date[5]] ";
    ### aggiungo lo zero al giorno e al mese
    if($new_date[3]>9){$new_day=$new_date[3];}else{$new_day="0$new_date[3]";}
    if($new_date[4]>8){$new_mon=$new_date[4]+1;}else{$new_mon="0".($new_date[4]+1);}
return $new_day . "-" . $new_mon . "-" . ($new_date[5]+1900);
}
--------------------------------
...semplice ma con gli anni che vanno dal 1980 in poi mi restituisce
questo...
--------------------------------
Data1: 01-01-1980 -  [timelocal: 315529200]-[localtime: 2-0-80]
Data1: 02-01-1980 -  [timelocal: 315615600]-[localtime: 3-0-80]
Data1: 03-01-1980 -  [timelocal: 315702000]-[localtime: 4-0-80]
Data1: 04-01-1980 -  [timelocal: 315788400]-[localtime: 5-0-80]
...
Data1: 25-09-1980 -  [timelocal: 338680800]-[localtime: 26-8-80]
Data1: 26-09-1980 -  [timelocal: 338767200]-[localtime: 27-8-80]
Data1: 27-09-1980 -  [timelocal: 338853600]-[localtime: 28-8-80]
Data1: 28-09-1980 -  [timelocal: 338940000]-[localtime: 28-8-80]
Data1: 28-09-1980 -  [timelocal: 338940000]-[localtime: 28-8-80]
Data1: 28-09-1980 -  [timelocal: 338940000]-[localtime: 28-8-80]
Data1: 28-09-1980 -  [timelocal: 338940000]-[localtime: 28-8-80]
Data1: 28-09-1980 -  [timelocal: 338940000]-[localtime: 28-8-80]
Data1: 28-09-1980 -  [timelocal: 338940000]-[localtime: 28-8-80]
...
e cosě fino alla fine
Dove ho sbagliato?
Grazie 
Marco

Dove ho sbagliato?
Non te lo so spiegare in dettaglio, ma conviene che prendi mezzogiorno
invece che mezzanotte:
    $data_timel =
timelocal(0,0,12,substr($data,0,2),(substr($data,3,2)-1),substr($data,6,4));
Per capire che cosa succede, bisognerebbe fare un'analisi più approfondita,
sicché non ti so dire se si possa parlare di malfunzionamento di localtime
(più probabilmente è una questione di arrotondamenti assolutamente
legittimi).
Comunque, per togliersi definitivamente dai problemi, ci sono una quantità
di moduli per il trattamento di date con cui è possibile fare la stessa
cosa (Date::Calc, Date::Manip e altri).
Ciao.

 cosa (Date::Calc, Date::Manip e altri).
Lo farò sicuramente, ho già visto che il modulo Date::Calc possiede
tante di quelle funzioni che mi torneranno utili in futuro....
Buona giornata e grazie.
Marco

 
Il problema e' legato al passaggio dall'ora legale a 
quella solare.
(orologio un'ora indietro)
In effetti per passare dalle:
00:00:00 28-09-1980
(primo istante del giorno 28-09-1980)
alle
00:00:00 29-09-1980
(primo istante del giorno 29-09-1980)
sono necessarie 25 ore e non 24 :(
Alle 04:00:00 del 28 l'orologio va' rimesso indietro di 
un'ora. 
in questo link trovi alcuni giorni in cui si sono compiuti 
i passaggi
http://toi.iriti.cnr.it/ist/it/ienitlt.html
un saluto
Marco