Werbung einblenden Werbung ausblenden


Home / Tutorials / Perl Handbuch / Datum ermitteln

Die Datumsfunktionen: time, localtime, gmtime
Darstellung des Datums in der Schreibweise: 18.11.2002  15:12:48
Darstellung des Datums in der Schreibweise: Montag, der 18.November 2002  15:12:48

Die Datumsfunktionen: time, localtime, gmtime

Für viele Anwendungen ist es ein nettes Feature, das Datum zu ermittelt, z.B. bei Gästebüchern, Foren, Chats. Bei anderen Anwendungen, wie z.B. Auktionen, ist es zwingend notwendig, da hier ermittelt werden muss, ob die Auktion schon abgelaufen ist.
Perl stellt zum Ermitteln des Datums drei Funktionen zur Verfügung:  time, localtime, gmtime
Bei localtime und gmtime muss noch unterschieden werden, ob die Rückgabe im Skalarkontext oder als Liste erfolgt.
Das folgende Skript zeigt die unterschiedlichen Funktionen:

$sekunden=time();
$zeiteinsskalar=gmtime();
@zeiteins=gmtime();
$zeitzweiskalar=localtime();
@zeitzwei=localtime();


print "$sekunden \n";
print "$zeiteinsskalar\n";
print "@zeiteins \n";
print "$zeitzweiskalar \n";
print "@zeitzwei \n";

Als Rückgabewert erhält man dann z.B.:

C:\test>perl zeit2.pl
1037628768
Mon Nov 18 14:12:48 2002
48 12 14 18 10 102 1 321 0
Mon Nov 18 15:12:48 2002
48 12 15 18 10 102 1 321 0
C:\test>

Dieses Skript wurde am 18. November 2002, um 15:12:48 ausgelöst. Bei der Rückgabe als Liste, (das ist nicht präzise, aber man versteht was ich meine), also bei dem Abspeichern in einen Array werden neun Werte zurückgegeben, die teilweise so nicht direkt verwendet werden können.
Die Werte sind im einzelnen:

1. Wert =>

  48 =>

Anzahl der Sekunden nach der vollen Minute

2. Wert =>

  12 =>

Anzahl der Minuten nach der vollen Stunde

3. Wert =>

  14 =>

Anzahl der Stunden von 1 bis 24 (gmtime und localtime differieren hier)

4. Wert =>

  18 =>

aktueller Monatstag also der 18. im November

5. Wert =>

  10 =>

der aktuelle Monat (wir haben November und nicht Oktober) ist um einen Monat zurück.

6. Wert =>

102 =>

das aktuelle Jahr nach Christi Geburt. Es fehlen 1900 Jahre.

7. Wert =>

    1 =>

Tag innerhalb der Woche, Montag = 1, Dienstag=2 etc.

8. Wert =>

321 =>

Tag innerhalb des Jahres

9. Wert =>

    0 =>

Sommerzeit oder nicht

Für die richtige Darstellung des Datums ist es ist wohl am einfachsten, das Datum aus dem Skalar Kontext zu nehmen und es mit Regular Expression zu bearbeiten.
Soll das Datum in deutscher Sprache dargestellt werden, dann treten drei Probleme auf:

  • Erstens ist der aktuelle Monat (im Beispiel 10) um einen Monat zurück.

  • Zweitens fehlen bei der Jahresangabe 1900 Jahre.

  • Drittens ist das Datum uneinheitlich, weil die führende Null fehlt, wenn ein Wert unter 10 ausgegeben wird.

Darstellung des Datums in der Schreibweise: 18.11.2002 15:12:48

Wie das Datum in der Schreibweise 18.11.2002 15:12:48 dargestellt wird, zeigt das folgende Skript:

($sec,$min,$hour,$mday,$mon,$year,$wday,$ydat,$isdst)=localtime();
             $jahr=$year;
             $monat=$mon+1;
             $tag=$mday;
             $jahr=$year;

$jahr=$year +1900;

if (length($monat) == 1)
{
    $monat="0$monat";
}
if(length($tag) == 1)
{
   $tag="0$tag";
}
if(length($hour) == 1)
{
   $hour="0$hour";
}
if(length($min) == 1)
{
   $min="0$min";
}
if(length($sec) == 1)
{
   $sec="0$sec";
}

$Xdatum=$tag.".".$monat.".".$jahr;
$Xzeit=$hour.":".$min.":".$sec;

#$Xdatum="$jahr$monat$tag";
#$Xzeit="$hour$min$sec";

print $Xdatum."  ".$Xzeit;

Das Ergebnis ist dann ein deutsches Datum vom Typ 18.11.2002 15:12:48.
Die mit einer Raute ausmarkierten Zeilen sind wichtig, wenn das so generierte Datum in eine sql Datenbank eingelesen werden soll. Dies ist meistens nicht beabsichtigt, da wohl alle relationalen Datenbanken den Datentyp timestamp kennen, der das Datum automatisch generiert.

Darstellung des Datums in der Schreibweise: Montag, der 18.November 2002 15:12:48

Wer jetzt noch den Wochentag (Montag, Dienstag, Mittwoch etc.) und den Kalendermonat (Januar, Februar, März, ect.) haben will, der muss noch ein bisschen schrauben:

($sec,$min,$hour,$mday,$mon,$year,$wday,$ydat,$isdst)=localtime();
             $jahr=$year;
             $tag=$mday;
             $jahr=$year;
             $monat=$mon+1;
             $jahr=$year +1900;



$wday=$wday-1;

if (length($monat) == 1)
{
    $monat="0$monat";
}
if(length($tag) == 1)
{
   $tag="0$tag";
}
if(length($hour) == 1)
{
   $hour="0$hour";
}
if(length($min) == 1)
{
   $min="0$min";
}
if(length($sec) == 1)
{
   $sec="0$sec";
}

$Xdatum=$tag.".".$monat.".".$jahr;
$Xzeit=$hour.":".$min.":".$sec;

@Wochentage=("Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag");
@Kalendermonat=("Januar","Februar","März","April","Mai","Juni","Juli","August","September",
"Oktober","November","Dezember");

$Xdatum=$Wochentage[$wday].","." der ".$tag.".".$Kalendermonat[$mon]." ".$jahr."   ".$Xzeit;

print $Xdatum;

Kompliziert wird das Ganze, wenn zu einem bestimmten Datum eine bestimmte Anzahl von Tagen dazuaddiert werden soll. Das ist z.B. bei einem Shop beabsichtigt, wenn die Lieferfrist X-Tage beträgt. Man möchte dann dem User genau mitteilen, wann er mit der Lieferung zu rechnen hat. Bei einer Auktion muss berechnet werden, wann die Auktion abgelaufen ist. Bei einer Support Plattform soll genau mitgeteilt werden, ab wann mit einer Antwort zu rechnen ist.
Müsste das selbst programmiert werden, dann wäre es ziemlich kompliziert. Es gibt hierfür ein Perl Modul, so dass überhaupt kein Problem besteht. Für Details siehe Tage vor und zurück rechnen.

vorhergehendes Kapitel