Datumsarithmetik
Michael Schröpl
- perl
Hallo Leute,
ich suche nach einer *schönen* Lösung, um die Differenz (in Tagen) zwischen zwei Datumswerten zu berechnen. Inklusive Schaltjahresproblematik und dem ganzen Zeug, jaja.
Meine Datumswerte liegen im Format DDMMYYYY vor.
Ich habe in der ActivePerl-Doku einen Modul HTTP::Date gefunden (auf die Idee wäre ich ohne Volltextsuche *nie* gekommen), mit dem ich das nach entsprechender Umformatierung meines Datums nach YYYYMMDD und dann nach "seconds since epoch" hingekriegt habe.
Es kommt mir aber ein wenig von hinten durch die Brust ins Auge vor ... und mich für eine Datums-Funktion von einem HTTP-Modul abhängig zu machen, igitt ...
Wie würdet Ihr das machen? Hat vielleicht jemand eine elegantere Lösung zur Hand?
sub age ($)
{
# Parameter zuweisen
my ($datum) = @_;
# Aktuelles Datum holen
my $heute = $today::value;
# Beide Werte umsetzen von DDMMYYYY nach YYYYMMDD
my $datum_YYYYMMDD = substr ($datum, 4, 4) . substr ($datum, 2, 2) . substr ($datum, 0, 2);
my $heute_YYYYMMDD = substr ($heute, 4, 4) . substr ($heute, 2, 2) . substr ($heute, 0, 2);
# Beide Werte umsetzen von YYYYMMDD in "seconds since epoch"
my $datum_ticks = HTTP::Date::str2time ($datum_YYYYMMDD);
my $heute_ticks = HTTP::Date::str2time ($heute_YYYYMMDD);
# Jetzt die Differenz in Sekunden berechnen
my $differenz = $heute_ticks - $datum_ticks;
# dann diese durch die Sekundenzahl eines Tages teilen
my $tag = 60 * 60 * 24;
my $ganze_tage = ($differenz - ($differenz % $tag)) / $tag;
# und zuletzt das Ergebnis dem Aufrufer zurückliefern
return $ganze_tage;
}
Hallo!
Ich finde, mit
$time = time();
leichter geht, da hast du nämlich die aktuelle Zeit schon in Sekunden.
Das alte Datum (mit dem du vergleichst) muss ja irgendwo gespeichert sein. Wenn du das ebenfalls als Sekundenzahl hast, sparst du dir 'ne Menge Schreibarbeit.
Ciao Micha
Das alte Datum (mit dem du vergleichst) muss ja irgendwo gespeichert sein. Wenn du das ebenfalls als Sekundenzahl hast, sparst du dir 'ne Menge Schreibarbeit.
Aber genau das habe ich eben nicht!
Ich habe nur DDMMYYYY (das kriege ich so in einer Datei) und muß es nach time()- oder irgend einem sonstigen Format umrechnen und dann vergleichen.
Hi,
Ich habe in der ActivePerl-Doku einen Modul HTTP::Date gefunden (auf die Idee wäre ich ohne Volltextsuche *nie* gekommen),
auch nicht auf Date::Calc? ;-) Meines Wissens sind solche Sachen wie Tagesdifferenzen damit kein Problem (aber beschwören möchte ich es auch nicht).
Cheatah
Hi,
Ich habe in der ActivePerl-Doku einen Modul HTTP::Date gefunden (auf die Idee wäre ich ohne Volltextsuche *nie* gekommen),
auch nicht auf Date::Calc? ;-)
Ich habe per Browser im Steuer-Frame der ActivePerl5.005-Doku (HTML) gesucht, und da gab es nur genau einen einzigen Treffer für "date", eben HTTP::Date.
Den habe ich dann halt genommen, da es offenbar keine Alternative gab. (Was mich natürlich gewundert hat - deshalb meine Frage!).
Und ich dachte bisher, bei ActivePerl wird man mit CPAN-Modulen totgeschmissen ... :-(
Hi,
auch nicht auf Date::Calc? ;-)
Ich habe per Browser im Steuer-Frame der ActivePerl5.005-Doku (HTML) gesucht, und da gab es nur genau einen einzigen Treffer für "date", eben HTTP::Date.
vielleicht hättest Du nicht nur in den bereits installierten Modulen suchen sollen... ;-)
Und ich dachte bisher, bei ActivePerl wird man mit CPAN-Modulen totgeschmissen ... :-(
Wird man auch: Unter http://www.ActiveState.com/packages/zips/ findest Du http://www.ActiveState.com/packages/zips/Date-Calc.zip. Nur noch kurz mit ppm installieren, und Bingo. Vorausgesetzt, ich hatte mit meiner Einschätzung recht *g*
Cheatah
Hi!
Noch'n Vorschlag: Das Modul Time::Local.
Siehe <../../sfarchiv/1999_4/t08300.htm> und http://www.activestate.com/activeperl/docs/lib/Time/Local.html.
Bye, Calocybe
Noch'n Vorschlag: Das Modul Time::Local.
Siehe <../../sfarchiv/1999_4/t08300.htm> und http://www.activestate.com/activeperl/docs/lib/Time/Local.html.
Yup, der ist in ActivePerl drin - gute Idee!
(Wenn man halt im Inhaltverzeichnis nur nach "date" sucht, findet man ihn nicht sofort ... :-/ )
Hallo Michael,
ich suche nach einer *schönen* Lösung, um die Differenz (in Tagen) zwischen zwei Datumswerten zu berechnen. Inklusive Schaltjahresproblematik und dem ganzen Zeug, jaja.
Du brauchst das Ganze zwar fuer Perl, aber ich denke, wenn du eine wirklich toll gemachte JavaScript-Loesung bekommst, wirst du das ohne Probleme in Perl portieren koennen. Und die tolle JavaScript-Loesung gibt es - bei Hatto von Hatzfeld: http://www.salesianer.de/util/kalender.html
viele Gruesse
Stefan Muenz
hi!
ich suche nach einer *schönen* Lösung, um die Differenz (in Tagen) zwischen zwei
Datumswerten zu berechnen. Inklusive Schaltjahresproblematik und dem ganzen Zeug, jaja.
Perl-Kochbuch:
=== cut ===
use Date::Calc qw(Delta_Days);
$days = Delta_Days($year1, $month1, $day1, $year2, $month2, $day2);
=== cut ===
bye, Frank!
Datumswerten zu berechnen. Inklusive Schaltjahresproblematik und dem ganzen Zeug, jaja.
Perl-Kochbuch:
=== cut ===
use Date::Calc qw(Delta_Days);
$days = Delta_Days($year1, $month1, $day1, $year2, $month2, $day2);
=== cut ===
Schöööön - jetzt müßte ich den Modul nur noch in ActivePerl5.005b509 finden ... ich mache erst mal die wichtigen Sachen weiter, bevor ich hier noch drei Zeilen Code sparen kann.
hi!
Datumswerten zu berechnen. Inklusive Schaltjahresproblematik und dem ganzen
Zeug, jaja.
Perl-Kochbuch:
=== cut ===
use Date::Calc qw(Delta_Days);
$days = Delta_Days($year1, $month1, $day1, $year2, $month2, $day2);
=== cut ===
Schöööön - jetzt müßte ich den Modul nur noch in ActivePerl5.005b509 finden ... ich mache
erst mal die wichtigen Sachen weiter, bevor ich hier noch drei Zeilen Code sparen kann.
C:>ppm install Date-Calc
bye, Frank!
C:>ppm install Date-Calc
bye, Frank!
Maybe, aber es ist nicht mein Rechner, auf dem das Zeug laufen soll - und ActivePerl ist schon mal als Voraussetzung vorhanden.
Hust, zurück ins Bett, das Fieber steigt wieder ...