Datumsberechnungen in Perl

  Perl
  Shell
  Dateitransfer
  OS
  Home

  Links

  Impressum
Zur Ausgabe von irgendwelchen Meldungen bzw. zur Bearbeitung der Logfiles mehrerer Tage braucht man immer wieder das heutige oder das gestrige Datum in verschiedenen Formaten (Hand auf's Herz: Bei wem sind die Formate für die Datumsangaben immer gleich ?). Wenn man das Problem des gestrigen Datums mal beiseite lässt, ist das in einer Unix-Umgebung schnell gelöst:

  ~> date '+%d-%m-%Y'

liefert ruckzuck das aktuelle Datum im gewünschten Format.

In perl muss ich ein kleines bisschen mehr machen:

Die grundlegende Funktion dafür ist

 ($sek,$min,$std,$mtag,$mon,$jahr,$wtag,$jtag,$isdst) = localtime(time);

(s. auch die übliche Perldoku). Dabei ist natürlich zu beachten, dass die Monatsangabe im Bereich 0 - 11 liegt, d.h. es muss 1 addiert werden. Zur Jahreszahl muss 1900 addiert werden, um die allgemein übliche Ausgabe "2001" zu bekommen, bzw. es muss 100 subtrahiert werden, um eine zweistellige Ausgabe zu erreichen.

Das kann man sich zwar zurechtbiegen, aber das ganze mehrfach in einem Skript (in unterschiedlichen Formaten) zu machen ist lästig.

Man kann das natürlich in eine "date +%xxx"-ähnliche Form bringen, wie es in dieser Funktion auch gemacht wurde:

sub now {
  
  my $FORMAT=$_[0];

  my $NOW=timelocal(localtime);
  my $y=sprintf("%02d",(localtime($NOW))[5]-100);
  my $Y=sprintf("%04d",(localtime($NOW))[5]+1900);
  my $m=sprintf("%02d",(localtime($NOW))[4]+1);
  my $d=sprintf("%02d",(localtime($NOW))[3]);
  my $H=sprintf("%02d",(localtime($NOW))[2]);
  my $M=sprintf("%02d",(localtime($NOW))[1]);
  my $S=sprintf("%02d",(localtime($NOW))[0]);

  $FORMAT =~ s/%y/$y/;
  $FORMAT =~ s/%Y/$Y/;
  $FORMAT =~ s/%m/$m/;
  $FORMAT =~ s/%d/$d/;
  $FORMAT =~ s/%H/$H/;
  $FORMAT =~ s/%M/$M/;
  $FORMAT =~ s/%S/$S/;

  return $FORMAT;
}

Diese Funktion wird mit
now("%Y-%m-%d")
aufgerufen und liefert in diesem Fall beispielsweise
2001-09-13
zurück.

now kennt folgende Parameter (die natürlich sehr eng an das Unix-date-Kommando angelehnt sind):

  • %Y: Jahreszahl vierstellig
  • %y: Jahreszahl zweistellig
  • %m: Monatsnummer (1-12)
  • %d: Tag (1-31)
  • %H: Stunde (0-23)
  • %M: Minute (0-59)
  • %S: Sekunde (0-59)
Diese Funktion ist zusammen mit einer parallel aufgebauten "yesterday"-Funktion als Modul date.pm erhältlich. Die Doku zu date.pm findet sich hier.

Ulrich Herbst
Letzte Änderung: 04.12.2003 23:48:46