kontrola datumu

Milos Dvorak milos na rosice.cz
Čtvrtek Červenec 3 08:36:21 CEST 2003


> 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