kaepten: Ermitteln ob ein Datum gültig ist

Hallo Forum

Ich kenn mich in der Perl-Datumsthematik leider nur sehr rudimentär aus und versuche ein Datum das in der Zukunft liegt zu prüfen ob es gültig ist.

So sollte also der 31.04.2002 als falsch entlarft werden. Gibts irgendeine Kalender-Funktionalität in Perl?

Vielen Dank für Hinweise

  1. use Mosche;

    Ich kenn mich in der Perl-Datumsthematik leider nur sehr rudimentär aus und versuche ein Datum das in der Zukunft liegt zu prüfen ob es gültig ist.

    So sollte also der 31.04.2002 als falsch entlarft werden. Gibts irgendeine Kalender-Funktionalität in Perl?

    use Time::Local;

    my @timetocheck = (0, 0, 0, 31, 4, 2002); # 31.04.2002 um 0:00

    if (timelocal(@timtocheck) > localtime) {
     print "Datum liegt in der Zukunft\n";
    }

    use Tschoe qw(Matti);

    1. Hoi Matti

      Vielen Dank für die Antwort, aber es löst nicht das Problem. Ich möchte nicht wissen ob es in der Zukunft liegt, sondern ob das angegebene Datum gültig ist! (Siehe mein Beispiel: 31.04.2002)

      kaepten

      1. Moin!

        Vielen Dank für die Antwort, aber es löst nicht das Problem. Ich möchte nicht wissen ob es in der Zukunft liegt, sondern ob das angegebene Datum gültig ist! (Siehe mein Beispiel: 31.04.2002)

        perldoc Time::Local   ;-)

        So long

        1. Hi Calocybe

          perldoc Time::Local   ;-)

          Ich komm echt nicht dahinter! Time::Local habe ich schon angeschaut, aber ich versteh nicht wie ich das anwenden soll um die gültigkeit eines Kalenderdatums zu prüfen?

          print scalar localtime timelocal_nocheck 0,0,0,31,4,2002;

          solte mir also sagen, dass es den 31.2.2002 nicht gibt? Der gibt mir aber

          Fri May 31 00:00:00 2002

          aus.

          cheers
          kaepten

          1. hallo kaeoten,

            perldoc Time::Local   ;-)

            Das ist IMHO in diesem Falle nicht gerade das beste Modul.

            Date::Manip koennte eventuell etwas für Dich sein, aber für so etwas simples kannst Du auch selbst etwas machen;-)

            <code>
            $date = '31.4.2002';
            print "$date ist ", is_date_valid($date)?"gueltig":"ungueltig","\n";
            $date = '2002/3/2';
            print "$date ist ", is_date_valid($date)?"gueltig":"ungueltig","\n";

            sub is_date_valid
            {
            my(@date_values) = split(/[/.-]/,shift,3); # default ist dd.mm.yyyy
            @date_values = reverse @date_values if($date_values[0] >31); # array umdrehen falls yyyy.mm.dd

            return 0 if $date_values[1] <1 or $date_values[1]>12; # monat stimmt nicht
            my(@m_days) = qw(0 31 28 31 30 31 30 31 31 30 31 30 31);
            $m_days[2] = 29 if is_leap_year($date_values[2]);

            return 0 if ($date_values[0] <1 or $date_values[0]>$m_days[$date_values[1]]); # tag stimmt nicht
            return 1;

            }

            sub is_leap_year # schaltjahrbestimmmung
            {
            my($year) = shift;
            return 0 unless $year % 4 == 0;
            return 1 unless $year % 100 == 0;
            return 0 unless $year % 400 == 0;
            return 1;
            }
            </code>

            Grüße
              Klaus

            1. Hoi Klaus

              Vielen Dank für die Komplettlösung! Das wird in der Tat mein Problem lösen, vor lauter Suchen nach Perl-Funktionen habe ich das einfache selbstüberprüfen sowie in Deinem Code ganz vergessen.

              kaepten

          2. Moin kaepten!

            perldoc Time::Local   ;-)

            Ich komm echt nicht dahinter! Time::Local habe ich schon angeschaut, aber ich versteh nicht wie ich das anwenden soll um die gültigkeit eines Kalenderdatums zu prüfen?

            Sorry, war mein Fehler, hab selber nicht richtig gelesen. Tatsaechlich kann man das mit dem Modul gar nicht feststellen.

            S:>perl -w -MTime::Local -e "print scalar localtime timegm(0,0,0,31,3,102)  # 31.04.2002"
            Wed May  1 01:00:00 2002

            Er rechnet also einfach den Sekundenwert aus, als ob es den Tag gaebe. Bei der Rueckuebersetzung wird das dann zu dem Tag, der wirklich diesen Sekundenwert hat.

            print scalar localtime timelocal_nocheck 0,0,0,31,4,2002;
            solte mir also sagen, dass es den 31.2.2002 nicht gibt?

            Wie Du von 31,4,2002 auf 31.2.2002 kommst, ist mir aber auch nicht ganz klar (d.h. was ist timelocal_nocheck?). Denk dran: Monat minus 1, Jahr minus 1900.

            So long

            1. Hoi Calocybe

              print scalar localtime timelocal_nocheck 0,0,0,31,4,2002;
              solte mir also sagen, dass es den 31.2.2002 nicht gibt?

              Wie Du von 31,4,2002 auf 31.2.2002 kommst, ist mir aber auch nicht ganz klar (d.h. was ist timelocal_nocheck?). Denk dran: Monat minus 1, Jahr minus 1900.

              Ach - vor lauter Verwirrung... Das war bloss ein Tippfehler. Natürlich meinte ich tatsächlich "solte mir also sagen, dass es den 31.4.2002 nicht gibt?"

              cheers
              kaepten