Perl/Funktionen für Datum und Uhrzeit

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

[Bearbeiten] Allgemeines zu diesen Funktionen

Die Basisfunktion der Zeitberechnung unter Perl ist time. Sie ermittelt den aktuellen Zeitpunkt, und zwar in Sekunden, die seit dem logischen Unix-Urknall, seit dem 1.1.1970, 0.00 Uhr, vergangen sind. Mit dieser Zahl können Sie dann eine der Funktionen localtime oder gmtime versorgen, um die einzelnen Elemente von Datum und Uhrzeit des aktuellen Zeitpunkts zu erhalten, also etwa Tag, Monat, Jahr oder Stunden und Minuten der Uhrzeit.

Beachtenswert ist auch das Standardmodul Time::Local. Dort finden Sie Umkehrfunktionen zu den hier vorgestellten Funktionen localtime und gmtime.

[Bearbeiten] gmtime - Zeitpunkt in Datums-/Uhrzeit-Elemente aufschlüsseln (Greenwich-Zeitzone)

Funktioniert genauso wie localtime, mit dem einzigen Unterschied, dass nicht die Uhrzeit auf dem Rechner ermittelt wird, sondern die Greenwich-Zeit (Nullmeridian).

[Bearbeiten] localtime - Zeitpunkt in Datums-/Uhrzeit-Elemente aufschlüsseln (lokale Zeitzone)

Ermittelt für einen Zeitpunkt die einzelnen Zeitangaben.

Erwartet als Parameter:

  1. die Anzahl Sekunden, gerechnet ab dem 1.1.1970, bis zum gewünschten Zeitpunkt. Um die Daten für den aktuellen Zeitpunkt zu ermitteln, einfach time oder gar nichts übergeben.

Gibt wahlweise eine Liste zurück, die aus 9 Elementen besteht, in denen die Einzeldaten gespeichert sind, oder eine Zeichenkette, gemäß der C-Funktion ctime, die zum ANSI-Standard gehört.

Beispiel
#!/usr/bin/perl -w
 
use strict;
use CGI::Carp qw(fatalsToBrowser);
 
my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat,
    $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
my $CTIME_String = localtime(time);
$Monat += 1;
$Jahrestag += 1;
$Jahr += 1900;
 
my @Wochentage = qw(Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag);
my @Monatsnamen = qw(Januar Februar März April Mai Juni Juli August September Oktober November Dezember);
 
my $datum_1 = sprintf("%s, der %02d.%02d.%04d", 
   $Wochentage[$Wochentag],
   $Monatstag, 
   $Monat, 
   $Jahr,
);
my $datum_2 = sprintf("%s der %02d. %s %04d", 
   $Wochentage[$Wochentag],
   $Monatstag, 
   $Monatsnamen[$Monat-1], 
   $Jahr,
);
my $zeit_1 = sprintf("%02d:%02d Uhr", 
   $Stunden,
   $Minuten,
);
my $zeit_2 = sprintf("%02d:%02d:%02d Uhr", 
   $Stunden,
   $Minuten,
   $Sekunden,
);
my $ansage = sprintf("Der heutige Tag ist der %3d. Tag im laufenden Jahr\n"
       ."Als CTIME-Ausgabe lautet dieser Zeitpunkt: %s\n", 
   $Jahrestag,
   $CTIME_String,
);
$ansage .= ($Sommerzeit 
   ? "Es ist Sommerzeit\n" 
   : "Es ist Normalzeit (keine Sommerzeit)\n"
);
 
print <<"END";
Content-type: text/plain
 
Datum (Variante 1): $datum_1
Datum (Variante 2): $datum_2
Uhrzeit (Variante 1): $zeit_1
Uhrzeit (Variante 2): $zeit_2
$ansage
END
;
Das Beispiel ermittelt die Zeitangaben des aktuellen Zeitpunkts, und zwar einmal im Listenkontext (erster Aufruf von localtime), und einmal im skalaren Kontext (zweiter Aufruf). Anschließend bereitet das Script die ermittelten Daten für die Ausgabe auf. Denn die zurückgegebenen Werte sind in vielen Fällen eher "Rohdaten", die für eine ordentliche Ausgabe noch nachbehandelt werden müssen.

Die Werte für $Monat und $Jahrestag werden zunächst um 1 erhöht, da der Rückgabewert intern bei 0 zu zählen beginnt (für Monate gelten anfangs die Monatsnummern 0 bis 11, und nicht 1 bis 12).

Die Jahreszahl wird um 1900 erhöht. Der Grund: der (numerische) Rückgabewert für das Jahr besteht in der Anzahl Jahre seit 1900. Für das Jahr 2000 würde also beispielsweise 100 zurückgegeben. Erst durch das Hinzuzählen von 1900 gelangt man zur tatsächlichen Jahreszahl.

Die dann definierten Listen für Wochentage und Monatsnamen bieten für die spätere Ausgabe die Möglichkeit, deutschsprachige Zeitbezeichnungen zu verwenden. Hier wird der qw()-Operator verwendet.

Die Ausgaben werden mittels der sprintf()-Funktion formatiert.

[Bearbeiten] time - Zeitpunkt ermitteln

Ermittelt die Anzahl Sekunden, die vom 1.1.1970 0.00 Uhr bis zum Augenblick des Aufrufs vergangen sind.

Erwartet keinen Parameter.

Gibt die Anzahl Sekunden zurück.

Beispiel
#!/usr/bin/perl -w
 
use strict;
use CGI::Carp qw(fatalsToBrowser);
 
my $RestSekunden = my $Sekunden = time();
 
my $Wochen = int($RestSekunden / (7 * 24 * 3600));
   $RestSekunden %= (7 * 24 * 3600);
 
my $Tage = int($RestSekunden / (24 * 3600));
   $RestSekunden %= (24 * 3600);
 
my $Stunden = int($RestSekunden / 3600);
   $RestSekunden %= 3600;
 
my $Minuten = int($RestSekunden / 60);
   $RestSekunden %= 60;
 
print <<"END";
Content-type: text/plain
 
Seit dem 1.1.1970, 0.00 Uhr sind $Sekunden Sekunden vergangen.
Das sind so ungefähr
    $Wochen Wochen, 
    $Tage Tage, 
    $Stunden Stunden, 
    $Minuten Minuten 
und $RestSekunden Sekunden.
END
;
Das Beispiel ruft time auf und speichert den Rückgabewert der Funktion in den Skalar $Sekunden. Anschließend berechnet das Script aus der Sekundenzahl die darin enthaltenen Wochen, Tage und Stunden. Um jeweils nur die ganzzahligen Anteile der Bruchberechnungen zu erhalten, wird die Funktion int darauf angewendet. Mit dem Modulo-Operator werden die Restsekunden ermittelt. a %= b ist eine Kurzschreibweise für a = a % b Zur Kontrolle gibt das Script die ermittelten Werte aus.
Meine Werkzeuge
Namensräume

Varianten
Aktionen
Übersicht
Schnell‑Index
Mitmachen
Werkzeuge
Spenden
SELFHTML