
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.
|
 |