Schrift
[thread]6787[/thread]

ungültige Datumseingaben



<< |< 1 2 >| >> 17 Einträge, 2 Seiten
jan10001
 2005-03-14 01:51
#52626 #52626
User since
2003-08-14
962 Artikel
BenutzerIn
[default_avatar]
Banale Frage sicherlich, aber wie erkennt man eigentlich ungültige Datumseingaben und wie kann ich die abfangen bevor's nen Error gibt?
esskar
 2005-03-14 01:53
#52627 #52627
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hmmm;
du musst für dich definieren, was ein gültiges format ist. und dann pattermatching machen;
oder entgeht mir jetzt ein wichtiger bestandteil deiner frage?
jan10001
 2005-03-14 02:05
#52628 #52628
User since
2003-08-14
962 Artikel
BenutzerIn
[default_avatar]
Sorry, hätte mich klarer ausdrücken müssen. :)
Problem der User gibt 31.2.2006 ein, klar das es keinen 31.2. gibt aber wie erkennen?
renee
 2005-03-14 09:05
#52629 #52629
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#! /usr/bin/perl

use strict;
use warnings;

my %hash = (1 => 31,
2 => 28,
3 => 31,
4 => 30,
5 => 31,
6 => 30,
7 => 31,
8 => 31,
9 => 30,
10 => 31,
11 => 30,
12 => 31,);

for my $datum(qw/12.12.2004 31.02.2006 3.5.1999/){
if($datum =~ /^(([012]?[0-9])|(3[01]))\.((0?[0-9])|(1[0-2]))\.(\d{2}|\d{4})$/){
my ($d,$m,$y) = split /\./, $datum;
$hash{2} = 29 if(is_leap_year($y));
$m =~ s/^0//;
print "yes\n" if($d > 0 && $d < $hash{$m});
}
}

sub is_leap_year{
my ($year) = @_;
return 0 unless($year % 4 == 0);
return 1 if($year % 400 == 0);
return 0 if($year % 100 == 0);
return 1;
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
ptk
 2005-03-14 12:19
#52630 #52630
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
CPAN:Date::Calc hat eine check_date-Funktion.
renee
 2005-03-14 12:59
#52631 #52631
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
die habe ich vorhin wohl übersehen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pKai
 2005-03-14 14:39
#52632 #52632
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use strict;
use warnings;

use Time::Local;

my @A = (
[25, 6, 1996 ],
[31, 2, 2005 ],
[29, 2, 2000 ],
);

foreach my $dmy (@A) {
my ($d, $m, $y) = @{$dmy};
print "invalid date: $d.$m.$y\n" unless eval { timelocal (0,0,0,$d,$m-1,$y) };
}


Edit: Perl -> Code; der Fehler mit dem interpretierten \n nervt.\n\n

<!--EDIT|pKai|1110804149-->
I sense a soul in search of answers.
Crian
 2005-03-14 14:44
#52633 #52633
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
ist eh viel leserlicher so =)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
jan10001
 2005-03-14 19:37
#52634 #52634
User since
2003-08-14
962 Artikel
BenutzerIn
[default_avatar]
Danke für die Tips!

@ptk
Mit Date::Calc kam ich nicht klar die check_date Funktion wollte einfach nicht. Da war immer alles falsch. :(

@pKai
Damit es läuft mußte noch "-1900" rein, aber jetzt läufts. :)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use strict;
use warnings;

use Time::Local;

my @A = (
[25, 6, 1996 ],
[31, 2, 2005 ],
[29, 2, 2000 ],
);

foreach my $dmy (@A) {
my ($d, $m, $y) = @{$dmy};
print "invalid date: $d.$m.$y\n" unless eval { timelocal (0,0,0,$d,$m-1,$y-1900) };
}
ptk
 2005-03-14 20:49
#52635 #52635
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=jan10001,14.03.2005, 18:37]@ptk
Mit Date::Calc kam ich nicht klar die check_date Funktion wollte einfach nicht. Da war immer alles falsch. :([/quote]
Falsch angewandt? Mit diesen Testwerten geht's:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
use Date::Calc qw(check_date);

@tests = (
[25, 6, 1996 ],
[31, 2, 2005 ],
[29, 2, 2000 ],
);

for (@tests) {
my @ymd = reverse @$_;
print "check_date @ymd ergibt " . check_date(@ymd) . "\n";
}


Uebrigens gibt's noch Date::Pcalc, falls man keinen C-Compiler voraussetzen kann.
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2005-03-14 01:51.