Bjoern Behrens: Funktion localtime ist 1h zurueck

Folgende Zeilen

$Jetztwert = time();
$Jetztzeit = localtime($Jetztwert);
print $Jetztwert;

geben das Datum wie folgt aus
Mon Jun  5 14:03:52 2000   wobei es eigentlich 15:03:52 ist.
Auf einem anderen Rechner mit gleichen Betriebssystem(Win95) und gleichem Perl wird allerdings die korrekte Zeit ( Mon Jun  5 15:03:52 2000 ) aus.
Woran kann das liegen? Wie rechnet localtime() die Sekundenanzahl um?
Die Sekundenanzahl ist naemlich auf beiden Rechner korrekt, so dass der Fehler auf der Funktion localtime() beruhen muss.

Vielen Dank schon mal im Vorraus
Bjoern

  1. Hallo Bjoern

    Woran kann das liegen? Wie rechnet localtime() die Sekundenanzahl um?
    Die Sekundenanzahl ist naemlich auf beiden Rechner korrekt, so dass der Fehler auf der Funktion localtime() beruhen muss.

    Verwendest du auch dieselbe Zeit(zone) auf beiden Rechnern?

    Zudem würde ich mal schauen, was gmtime so ausgibt, da sollte nämlich konsequent nur GMT-Zeit rauskommen. Vielleicht ignoriert localtime auch komischerweise einfach die Zeitzone und gibt GMT aus...?

    bis nextens
    xitnalta

    1. Zudem würde ich mal schauen, was gmtime so ausgibt, da sollte > nämlich konsequent nur GMT-Zeit rauskommen. Vielleicht ignoriert localtime auch komischerweise einfach die Zeitzone und gibt GMT aus...?

      könnte man das ändern???

    2. Hi!

      Verwendest du auch dieselbe Zeit(zone) auf beiden Rechnern?

      Yepp! Laut Win95 schon!

      Zudem würde ich mal schauen, was gmtime so ausgibt, da sollte nämlich konsequent nur GMT-Zeit rauskommen. Vielleicht ignoriert localtime auch komischerweise einfach die Zeitzone und gibt GMT aus...?

      Mit der Funktion gmtime() zeigen beide Rechner die gleiche Uhrzeit an! Aber warum 2h hinter der MEZ?
      Als Ergbenis erhalte ich 13:39:15  fuer 15:39:15 !
      Das waere grundsaetzlich kein Problem, aber ist dies auch der Fall fuer Winterzeit?

      Bye Bjoern

      1. Auch Hi!

        Verwendest du auch dieselbe Zeit(zone) auf beiden Rechnern?
        Yepp! Laut Win95 schon!

        *Ganz* sicher? Welche Zeitzone ist denn eingestellt, "Berlin" oder "Athen"?

        Mit der Funktion gmtime() zeigen beide Rechner die gleiche Uhrzeit an! Aber warum 2h hinter der MEZ?
        Als Ergbenis erhalte ich 13:39:15  fuer 15:39:15 !
        Das waere grundsaetzlich kein Problem, aber ist dies auch der Fall fuer Winterzeit?

        Hier liegt vielleicht der Hund begraben. Wir leben momentan in der Zeitzone MESZ (Mitteleuropaeische Sommerzeit; auch CEST (central european summer time); auch CET DST (central european time, daylight saving time)). Diese ist der GMT zwei Stunden voraus, also GMT +0200. Waehrend der kalten Jahreszeit haben wir MEZ (bzw. CET). Da dies die eigentliche normale Zeit ist, heisst die nicht MEWZ (ME-Winterzeit), sondern einfach nur MEZ. Und die ist == GMT +0100. Und deswegen ist also 13:39:52 GMT momentan 15:39:52 hiesiger Zeit, waehrend des Winters dieselbe GMT aber nur 14:39:52. Dein Problem koennte also damit zusammenhaengen, dass auf einem der Rechner korrekt die Sommerzeitzone (+0200) eingestellt ist, auf dem anderen aber noch die Winterzeitzone (+0100).

        Trotzdem wundert mich das Verhalten Deines kleinen Scriptes. Denn: Die Sekundenzahl, die time() zurueckgibt, bezieht sich immer auf GMT. Der Rechneruhr bzw. das OS kennt aber auf PCs nur die lokale Zeit. Also muss mithilfe der eingestellten Zeitzone auf die GMT zurueckgeschlossen werden. Wenn Deine Zeitzone jetzt faelschlicherweise nur auf GMT +0100 steht, liefert time() zwar eine um 1h falsche GMT zurueck. Beim localtime()-Aufruf, wo die (falsche) Zeitzone wieder draufaddiert wird, muesste sich dieser Effekt aber wieder aufheben, sodass localtime() *immer* die auf dem Rechner eingestellte Uhrzeit zurueckgeben sollte. Kann es sein, dass ich die Beschreibung da ein bisschen missverstanden habe?

        So long

        1. Hi!

          *Ganz* sicher? Welche Zeitzone ist denn eingestellt, "Berlin" oder "Athen"?

          Berlin, ich bin ja nicht in Athen ...

          Das ist ja genau das Problem,beide Rechner haben die gleiche Zeiteinstellung: beide Zeitzone "Berlin", beide zeigen unter Windows95 / Dos und Bios gleiche (korrekte) Zeit an! Und Trotzdem gibt der eine Rechner beim gleichen Script eine Stunde weniger aus!

          Vielen Dank fuer die Erlaerung mit dem Zeitzonen, ich denke auch, dass da der Hund begraben liegt...
             Bjoern

  2. Hallo,

    Woran kann das liegen? Wie rechnet localtime() die Sekundenanzahl um?

    time liefert eine 9-stellige Zahl, das sind die Sekunden seit 1.1.1970, zum Test gib mal ein:

    perl -e 'print time'

    localtime gibt eine Liste zurück wobei hier mal nur 6 Elemente interessieren dürften:
    @z = localtime(time);
    $z[4] += 1; # der Monat
    $z[5] += 1900; # das Jahr

    print "$z[3].$z[4].$z[5] $z[2]:$z[1]:$z[0]\n";

    HTH, Rolf

    1. hi!

      localtime gibt eine Liste zurück wobei hier mal nur 6 Elemente interessieren dürften:

      Das ist falsch! localtime liefert im skalaren Kontext einen Skalar zurück, im Listenkontext eine Liste. Und
      überhaupt: was hat deine Antwort mit der Frage zu tun?

      bye, Frank!

  3. Hallo Bjoern,

    Ich kann Dir leider auch nicht sagen, woran das aufgetauchte Problem liegt, aber wie es leicht zu umgehen ist ;-)
    Man kann folgendermaßen vorgehen (erhöht vor allem auch die Flexibilität des Skripts, falls es mal auf anderen Servern laufen soll):

    $zeitverschiebung = -1;
      ($sek,$min,$std,$tag,$mon,$jahr,$wtag,$jtag,$isdst) = localtime(time() + $zeitverschiebung * 3600);

    d.h. einfach die Sekunden der Zeitverschiebung auf das Ergebnis von time() aufaddieren.
    Man könnte auch auf die Stunde einfach die Zeitverschiebung aufaddieren, aber das hab` ich schnell wieder aufgegeben, nachdem ich die beschriebene Methode entdeckt hatte, da das nur unötige Scherereien beim Datumswechsel verursacht ;-)

    Gruß AlexBausW

    P.S.: Ich weis, daß das das localtime()-Problem nicht löst, kann aber die Methode wirklich empfehlen.