Wie man bei time gesehen hat, ist Perl ja durchaus in der Lage, die Systemzeit auszugeben. Aber die Zeit in Sekunden seit 1.1.1970 bringt einen nicht wirklich weiter...
Deswegen gibt es in Perl noch die Funktion localtime(). Man kann der Funktion localtime einen beliebigen Wert übergeben, der kompatibel ist zu time ist, und localtime errechnet daraus Tag, Stunde, Minute, Sekunde, Monat, Jahr, Wochentag, Jahrestag und Sommerzeit.
my %zeit=&Aktuelle_Zeit; my $wzsz='';
if ($zeit{sommerzeit} == 0){$wzsz="Winterzeit";} else { $wzsz="Sommerzeit";} print "$zeit{wochentagtext}, $zeit{tag}.$zeit{monat}.$zeit{jahr}, $zeit{stunde}:$zeit{minute}:$zeit{sekunde} Uhr $wzsz";
############
# Zeit- und Datumsfunktion
#################################
sub Aktuelle_Zeit{ my @wochentage = ("Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag"); my @monatsnamen = ("","Januar","Februar","März","April", "Mai","Juni","Juli","August","September","Oktober", "November","Dezember"); my ($sec,$min,$hour,$heutetag,$heutemonat,$heutejahr,$wday,$yday,$isdst) = localtime(time);
$heutemonat++;
$heutejahr+=1900;
$wday--;
if ($wday eq '-1'){$wday=6;}
$hour="0$hour" if (length($hour) == 1);
$min="0$min" if (length($min) == 1);
$sec="0$sec" if (length($sec) == 1);
my $tagalstext=$wochentage[$wday];
$werte{wochentagtext}=$tagalstext;
my $monatalstext=$monatsnamen[$heutemonat];
$werte{monattext}=$monatalstext;
return %werte;
}
Ich habe mal ne kleine Subroutine geschrieben, die als Rückgabewert ein Hash zurückgibt, das alle Werte enthält. Mit diesem Unterprogramm kann man auf leichte Weise die aktuellen Zeit- und Datumsdaten abfragen und ausgeben.
Die einzelnen Werte findet man im Hash unter:
- stunde
- minute
- sekunde
- tag
- monat
- jahr
- wochentag: 0 (Montag) - 6 (Sonntag)
- jahrestag: Wievielter Tag des Jahres
- sommerzeit: ist Sommerzeit?
- tagalstext: Wochentag als Text
- monatalstext: Monat als Text
Kommentare zum Beitrag "Uhrzeit und Datum bestimmen in Perl"
Kommentar von Perl-Uwe
http://search.cpan.org/perldoc?DateTime
Perl 4 ist seit Jahren tot :-)
Kommentar von Admin
Toller Kommentar... was will uns der Gast damit sagen? Ja: Es gibt das Modul und ja, man spricht in letztet Zeit immer öfters von Perl 6...
Und um etwas konstruktiver mit diesem Kommentar umzugehen:
Warum soll ich mir ein Modul suchen und ggf. erst installieren, wenn überhaupt möglich, da es vielleicht auf nem Webserver laufen muß, auf dem ich selbst nix installieren kann, das das Gleiche kann wie die eingebaute Funktion von Perl?
Ich hab mir das Modul eben mal näher angesehen, und da reicht es mir schon wenn ich lese:
"KNOWN BUGS
The tests in 20infinite.t seem to fail on some machines, particularly on Win32. This appears to be related to Perl's internal handling of IEEE infinity and NaN, and seems to be highly platform/compiler/phase of moon dependent.
If you don't plan to use infinite datetimes you can probably ignore this. This will be fixed (somehow) in future versions."
Was ich mal frei übersetze mit:
Die Tests in 20infinite.t funktionieren manchmal nicht, vor allem auf Windows-Maschinen... der Fehler wird behoben irgendwann in späteren Versionen...
Vielleicht funktioniert auch mehr nicht? Warum soll ich ne Funktion verwenden, die bekanntermaßen Fehler hat?
Und überhaupt: Muß für jedes Teilproblem ein Modul verwendet werden? Wird nicht gerade deshalb Perl immer weiterentwickelt, weil sich nicht jeder auf der Schiene "Ich kenn da ein Modul, das macht alles prima für mich..." bewegt?
Kommentar von Renee Bäcker
Ich würde da an dem Code noch etwas anders machen.
Aus:
$hour="0$hour" if (length($hour) == 1); $min="0$min" if (length($min) == 1); $sec="0$sec" if (length($sec) == 1);
Uwe hat schon recht, dass man viele solcher Sachen mit CPAN-Modulen lösen kann. Aber manchmal braucht man seine eigene Sub...
P.S.: Es wäre schön, wenn man in Kommentaren auch etwas wie "Code-Tags" hätte.
Kommentar von Admin
Code Tags sind eingebaut... Schön?
Kommentar von Perl-Uwe
DateTime ist ein sehr weit verbreitetes und vielgenutztes CPAN-Modul. Es läuft auch unter Windows problemlos. (Der von Dir angesprochene Bug bezieht sich auf ein selten genutztes Feature - "unendlich" als Datumsangabe.)
Man kann auch als Nicht-Root Module installieren. Mit einem bloßen FTP-Zugang ist das sicher bei einem XS-Modul für einen weniger erfahrenen Perl-Programmierer schwierig, da stimme ich Dir zu. Aber beim Hosting habe ich sowieso eine andere Meinung (Stichwort: mod_cgi vs. mod_perl/FastCGI).
Natürlich ist für das reine Ermitteln der aktuellen Zeit kein CPAN-Modul notwendig. Aber die Anforderungen wachsen ja. Spätestens wenn man Datumsarithmetik machen möchte (welcher Tag/Monat ist in drei Tagen), sollte man zu DateTime greifen. Sich schon vorher damit vertraut zu machen kann m. E. nicht schaden.
Uwe Völker
http://www.perl-uwe.de/
Kommentar von Admin
Ist ja richtig... Aber ich wollte ja vor allem rüberbringen, wie die Grundfunktion funktioniert.
Wobei ich noch dazu sagen möchte: Zeitabstände könnte man dann auch noch mit timelocal errechnen... aber das später. Und dann gibts auch ne kleine Anleitung zu dem oben genannten Modul.