Was ist der beste Weg, um den UTC-offset in Perl?
Ich brauche, um den UTC-offset der aktuellen Zeitzone in Perl in ein cross-Plattform (Windows und verschiedene Unix-Geschmacksrichtungen) Weg. Es sollte genügen dieses format:
zzzzzz, das entspricht ±hh:mm in relation zur UTC
Sieht es aus wie ich sollte in der Lage sein, um es über strftime()
ist, aber es nicht konsistent zu sein scheint.
Unix:
Input: perl -MPOSIX -e "print strftime(\"%z\", localtime());"
Output: -0700
Windows:
Input: perl -MPOSIX -e "print strftime(\"%z\", localtime());"
Output: Mountain Standard Time
Während es scheint, dass Unix gibt mir, was ich will (oder zumindest so etwas in der Nähe), Windows nicht. Ich bin mir ziemlich sicher, dass ich es tun kann, mit Date::Time
oder ähnliches, aber ich möchte wirklich nicht irgendwelche Abhängigkeiten, die ich nicht garantieren kann, dass ein Benutzer durch unsere Breite installierte Basis.
Übersehe ich etwas offensichtliches hier? Vielen Dank im Voraus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Time::Local
sollte den trick tunTime::Local
ist ein core-Modul in alle Perl-5-Distributionen."Ich möchte wirklich nicht irgendwelche Abhängigkeiten, die ich nicht garantieren kann, dass ein Benutzer durch unsere Breite installierte Basis"
Wie etwa eine benutzerdefinierte Kopie von Date::Time (nennen wir es Meine::Date::Time) in Ihrer installation? Zum Beispiel,
Können Sie berechnen Sie die Differenz zwischen
localtime($t)
undgmtime($t)
. Hier ist meine version, inspiriert von mob's Antwort:Einem tragbaren Methode ist das vergleichen der Ausgabe des
localtime
mitgmtime
Jemand wies darauf hin, dass dies bereits umgesetzt ein Modul irgendwo in 5, 4, 3, ...
@a[5,4,3]
und@b[5,4,3]
repräsentieren den gleichen Tag. Ich kombiniere Sie Jahr, Monat und Tag in einer einzigen Zahl, so kann ich mit einem Vergleich statt drei. Könnte man auch größere zahlen als die, 366 und 31 und Sie würde immer noch das richtige Ergebnis.($a[5]<<13)|($a[4]<<5)|$a[3]
. Auch die<=>
operator, der verwendet werden könnte, um ersetzen Sie die if-Anweisung.($a[5]<<9)|$a[7]
($a[7]
ist die Tag-Nummer im Jahr)