Ermitteln ob ein Datum gültig ist
kaepten
- perl
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
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);
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
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
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
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
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
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
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