Die Zeitverschiebung oder Die geheimen Tage
KucKucK
- perl
Hallo,
bei meinem Programm kann ich durch eine Zeitverschiebung von einer Stunde vom 30.Juni Abends zum 31.Juni (anstatt zum 1.Juli) gelangen.
Ich verwende die Methode timegm, um das Datum in Linux Zeit umzurechnen. Dann füge ich meinen time shift hinzu. Im Anschluß konvertiere ich zurück mit gmtime (Umkehrfunktion von timegm). Das Resultat ist allerdings ein Datum, das es gar nicht gibt.
Kann mir bitte jemand sagen, wo mein (Denk-)fehler liegt ? Das Programm ist anbei. Danke und lieben Gruß,
KucKucK
#!/usr/bin/perl -w
use strict;
use Time::Local;
my $time = "2006-06-30 23:30:00";
my $shift= 60;
#extract date from line
$time =~ /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/;
#perform time shift
my $sec, my $min, my $hour, my $mday, my $mon, my $year, my $wday, my $ydat, my $isdst;
my $time_in_sec = timegm($6,$5,$4,$3,$2,$1);
print "\nTime in sec: ".$time_in_sec." = ".$time;
my $new_time_in_sec = $time_in_sec + 60 * $shift;
print "\nNew time in sec: ".$new_time_in_sec." = ";
($sec,$min,$hour,$mday,$mon,$year,$wday,$ydat,$isdst) = gmtime($new_time_in_sec);
#format output string
my $newDate = (($year+1900)."-".CD($mon)."-".CD($mday)." ".CD($hour).":".CD($min).":".CD($sec));
$time=~ s/\d{4}-\d{2}-\d{2}\ \d{2}:\d{2}:\d{2}/$newDate/;
print $newDate."\n";
sub CD {
my $dateString = shift;
if (length($dateString)==1) {$dateString = "0".$dateString;}
return $dateString;
}
Hell-O!
bei meinem Programm kann ich durch eine Zeitverschiebung von einer Stunde vom 30.Juni Abends zum 31.Juni (anstatt zum 1.Juli) gelangen.
Scheint ein Bug zu sein, einen ähnlichen Bug hat der Autor des Moduls mit dem Hinweis abgebügelt, dass sein Modul nicht für Datumsberechnungen gedacht sei (Ungenauigkeiten bitte ich, meinem leidlichen Englisch zuzuschreiben).
Vielleicht bist du bei Datumsberechnungen mit Date::Calc besser bedient.
Siechfred
Hi,
my $time = "2006-06-30 23:30:00";
$time =~ /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/;
my $time_in_sec = timegm($6,$5,$4,$3,$2,$1);
Du wirfst timegm den Juli vor, nicht den Juni. Der Monat geht von 0 bis 11, nicht von 1 bis 12 (vermutlich da der Monat häufig als Index auf ein Array mit Monatsnamen verwendet wird).
($sec,$min,$hour,$mday,$mon,$year,$wday,$ydat,$isdst) = gmtime($new_time_in_sec);
Hier kommt auch wieder der Juli, also 6, zurück.
my $newDate = (($year+1900)."-".CD($mon)."-".CD($mday)." ".CD($hour).":".CD($min).":".CD($sec));
Du machst hier die Anpassung wieder nicht.
Der Fehler liegt also nicht in gmtime/timegm, sondern in Deiner fehlerhaften Benutzung derselben.
cu,
Andreas