Hallo Leute,
ich bin gerade dabei, ein bißchen in Perl mit Uhrzeiten herumzurechnen.
Was ich haben möchte, das ist eine saubere Erkennung eines Datumswechsels auf meiner Maschine (weil sich mit diesem Datumswechsel die Aufgabenstellung meines laufenden Programms ändert).
Das sieht ja auf den ersten Blick nicht so arg schwer aus:
my $now = time();
my $end_of_day = $now - ($now % 86400) + 86400;
und dann
while (time() <= $end_of_day)
{ ... }
Tja, wenn ich nun in Greenwich wohnen würde und es keine Sommerzeit gäbe, dann wäre ich bereits fertig.
Beides ist aber nicht der Fall (vor allem im Moment).
Mein Wert liegt genau zwei Stunden daneben (die 'Umschaltung' erfolgt derzeit also um 2 Uhr früh).
Eine der beiden Stunden kann ich "per Definition" abziehen, weil ich die Zeitzone, in welcher das Programm laufen wird, mit ziemlicher Sicherheit kenne (nämlich "hier").
Ich fände es aber schöner, wenn ich irgendwo die Anzahl der Zeitzonen ablesen könnte. Mein erster Blick fiel auf die Environment-Variable "TZ" - aber da steht "MEZ" drin, nicht etwa "+1" oder etwas ähnlich Numerisches, was sich als Faktor für 3600 eignen würde, so daß ich das Produkt der beiden von meinem time()-Wert abziehen könnte. Eine Tabelle aller symbolischen TZ-Werte in mein Programm einzubauen fände ich nicht sonderlich ästhetisch - zumal die womöglich noch nicht mal universell eindeutig sein müssen, denke ich mal ...
Die andere Stunde Differenz ist dann die Sommerzeit.
Über localtime() bekomme ich im letzten der vielen Parameter "isdst" ein Flag, das mir (laut Google - meine Perl5-Doku setzt an dieser Stelle einfach Kenntnisse des C-Compilers voraus, pfui Teufel) sagt, ob wir Sommerzeit haben oder nicht oder ob das System darüber keine Aussage machen kann ... (letzteres fände ich nicht so toll).
Auf meiner Maschine bekomme ich in der Tat den erfreulichen Wert 1 zurück. Und im Moment ist es ja wohl offensichtlich so, daß "Sommerzeit" identisch ist mit "genau eine Stunde Verschiebung" ... solches implizite Wissen möchte ich allerdings nicht so wahnsinnig gerne in meinen Quelltext einbrennen, falls es auch irgendwie eine andere Lösung gäbe, wo man die tatsächliche Zeit-Differenz ablesen könnte.
Was ich auch tun könnte, das wäre, mit localtime() und gmtime() die beiden entsprechenden Uhrzeiten als Komponenten-Felder zu berechnen und dann irgendwie daraus die Differenz zu berechnen.
Das würde zwar sämtliche Effekte subsummieren ... aber ich müßte beides erst mal wieder in Sekunden zurückrechnen und dann die Differenz aus beiden Werten bilden ... und wie mache ich das im allgemeinen Fall, ohne komplette Kalender- und Schaltjahresrechnerei?
Ich könnte mit der Differenz der beiden Stunden-Werte arbeiten und den Rest vernachlässigen ... dann aber würde ich wieder implizite Annahmen über meinen Standort verwenden müssen ... oder?
Daher meine Frage:
- Gibt es in Perl irgendwelche (von mir übersehenen) Variablen,
Funktionen oder was auch immer, welche mir (zuverlässiger als oben
beschrieben und ohne viel Rechnerei)
a) die Zeitzonenentfernung von Greenwich bzw.
b) die Zeitverschiebung durch Sommerzeit
jeweils als Zahlenwerte zurückliefern würden?
Letzten Endes will ich $end_of_day korrekt gesetzt bekommen.
Lösungen _ohne_ erforderliche Installation irgendwelcher CPAN-Module
würde ich bevorzugen (das Zeug müßte ggf. auf einen Haufen Produktionsmaschinen drauf - das würde ich gerne vermeiden, zumal ich das normalen CPAN-online-Installationsverfahren wg. Firewall nicht so ohne weiteres verwenden darf).
Viele Grüße
Michael