KucKucK: Die Zeitverschiebung oder Die geheimen Tage

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";

correct date that the format can be used

input-param:  digit

return:       string using 2 digits

sub CD {
        my $dateString = shift;
        if (length($dateString)==1) {$dateString = "0".$dateString;}
        return $dateString;
}

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

    --
    Hier könnte Ihre Werbung stehen.
    Viel Lärm um nichts || Steuerliche Einordnung des Rangrücktritts
  2. 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

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.