kontrola datumu

Richard Ruibar admin na kom.cz
Úterý Červenec 22 18:14:32 CEST 2003


Mno, a jak znamo, v Perlu je vzdy vice cest, me napadla tato:

$day = 29;
$mon = 2;
$year = 2003;

use Time::Local;

$time = timelocal(0, 0, 0, $day, $mon-1, $year-1900);
($a, $a, $a, $day2, $mon2, $year2, $a, $a, $a) = localtime($time);

if (($day2 == $day) && ($mon2 == ($mon-1)) && ($year2 == ($year-1900)))
{print "OK";}
else {print "KO";}

   Rozhodne bych s tim neobtezoval MySQL server a resil to na urovni Perlu.
Budto
takhle, nebo jak psal kolega nize. Toto reseni ma tu vyhodu, ze pri pouziti
nesmyslneho
udaje pro den nebo mesic Perl vrati chybovou hlasku, jako napr: "Day '32'
out of range
1..31 at skript radek.", kterou by se dalo vyuzit. Nevyhoda je v tom, ze pry
timelocal
na soucasnych pocitacich zpracovava data jen do roku 2038.

   Na tema manualu a knih k Perlu bych rekl jen tolil, ze me sveho casu take
uvadely
v zoufalstvi odkazy na knihovni moduly C. Mel jsem to ale jednodussi,
protoze Cecko
znam take. Nicmene kdyz chce clovek znat nejake detaily, je to pro
greenhorna k nicemu.
Vse se zmeni v okamziku, kdy si nainstalujete Linux, ten totiz obsahuje
manualove stranky
k temto modulum a tak pokud vas O'Reily odkaze na ctime(3), tak jednoduse
zadate
"man 3 ctime" a prectete si to. Tyhle podrobnosti v knihach byt nemohou,
protoze pak
by takova "Programovani v jazyce Perl" nemela jen 700 stranek, ale 7 000 :-)

Richard Ruibar
www.kom.cz

> > Date: Wed, 2 Jul 2003 18:11:38 +0200
> > From: Petr Vileta <petr na practisoft.cz>
> >
> > Ve webovem formulari nekdo vyplni datum. Protoze to je textove pole,
> > je nutne to napred zkontrolovat zda je tam den, mesic a rok (na 4
> > cislice), ale potom je treba jeste zkontrolovat, zda takove datum je
> > vybec platne (prestupne roky, 31 dubna a podobne nesmysly). Tak jsem
> > udelal tenhle select (psano v perlu)
> > (...)
> > $sth=$dbh->prepare("select ifnull(truncate(date_sub(DATE_ADD($datum,
> > INTERVAL 1 day), interval 1 day)/1000000,0)=$datum,0)");
>
> Mne ten select v mysql 3.23.56 vraci 0 vzdy. Neni mi jasny duvod pouziti
> truncate. Co mi ale funguje, je:
>
> mysql> select if(date_sub(date_add('2003-12-31', interval 1 day),
>     -> interval 1 day) = '2003-12-31', 1, 0) Platne;
> Platne: 1
>
> mysql> select if(date_sub(date_add('2003-02-29', interval 1 day),
>     -> interval 1 day) = '2003-02-29', 1, 0) Platne;
> Platne: 0
>
>
> Proc to nechcete udelat primo v tom Perlu?
>
> #!/usr/bin/perl -w
> use strict;
> use POSIX;
>
> sub JePlatneDatum {
>     my ($rok, $mesic, $den) = split (/-/, $_);
>     return ($_ eq strftime("%Y-%m-%d", 0, 0, 0, $den, $mesic-1,
>             $rok-1900) ? 1 : 0);
> }
>
> foreach ("2003-12-31", "2003-02-29") {
>     print "Datum $_ ", JePlatneDatum($_) ? "je" : "není", " platne\n";
> }
>
> [milos perl]$ ./datum.pl
> Datum 2003-12-31 je platne
> Datum 2003-02-29 není platne
>
>




Další informace o konferenci Test