Michael Schröpl: Datumsarithmetik

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;
}

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

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

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

    1. 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 ... :-(

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

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

    1. 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 ... :-/ )

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

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

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

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

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