Autor Zpráva
Jendulus
Profil *
Nevěděl by někdo, jak nějakým elegantním, jednoduchým způsobem ošetřit to, zda uživatel zadal datum ve správném tvaru a bez znaků, které tam nepatří? Dik
Petra
Profil
No tak nejlépe je vykašlat se na javascript, ten si stejně vypnu a udělat to <select>em. Tam nikdo nezadá nic, co by nebylo v nabídce. No v tom javascriptu je potřeba asi povolit jen keyCode číslic (to jsou tuším 48 až 57) a tečku. A pak ještě kontrolovat aby to nebyla moc velká nebo moc malá čísla, to mi přijde docela zbytečně složitý, když se ty data dají "předpřipravit".
Jendulus
Profil *
<select>em by to slo asi stezi. Uzivatel totiz muze zadat jakekoli datum od 01.01.0001 do vzdalene budoucnosti...
Yuhů
Profil
Jendulusi, ošetřit datum je docela netriviální, protože je tam strašná spousta pravidel.

Napiš sem prosím formát, v jakém si datum představuješ.

Petro, přehození do selectu je fajn nápad, ale nedá se to použít na normálních stránkách, protože to příšerně nafukuje kód.
Tomik
Profil
Tak,tak nic jednoduchého.

Nevím, ale předpokládám, že to datum pak posíláš nějakému scriptu (myslím serverovému).
Pokud používáš PHP tak, tam se to řeší jednou jedinou funkcí (CheckDate).
Jendulus
Profil *
Je to estě sožitějši než to vypadá.Datum ma byt možno zadávat jednak ve formátu ddmmyyyy, druhak dd.mm.yyyy a třet'ak dd/mm/yyyy.
To víte, ty šéfové...
Pomoci všemožnejch podmínek už mi to částečně šlape, jen sem chtěl vědět, jesli by to nešlo nějak jednodušeji...
Tomik
Profil
V tom PHP by se to krásně vyřešilo tou funkcí ChechDate.
Jendulus
Profil *
To je smula ja delam JSP ;-)
Tomik
Profil
Tak s tím ti neporadím ;-)
Oswald
Profil *
ChechDate() ale kontroluje pouze formát datumu MM. DD. RRRR nebo se pletu?
Tomik
Profil
Do funkce CheckDate se vkládají tři parametry: mesíc (1-12), den (1-28,29,30 nebo 31) a rok (1900-32767).

Já bych si zjistil dálku toho datumu pomocí strval, pokud by měl délku 8, tak je jasné, že tam není žádné oddělovátko, pokud je délka větší tak tam to oddělovátko je (tečka nebo lomítko).

No a pak bych akorát tu proměnou s datumen rozdělil na den, měsíc a rok (pomocí substr) podle toho zda je v datum "oddělovátko".
Fred
Profil
Asi bych v tomto případě použil nějaké hotové řešení např. : http://www.mojavelinux.com/projects/popupcalendar/
http://www.javascriptkit.com/script/script2/tengcalendar.shtml
zivan
Profil
Osetreni spravneho formatu data je dobry priklad na pouziti regularniho vyrazu.
Napr:
^[0-9]{1,2}[./-][0-9]{1,2}[./-][0-9]{2,4}$

A odfiltrovani chybnych datumu jsem resil vlozenim data do objektu Date, precteni hodnot a jejich porovnani. Pokud se nerovnaly, tak bylo zadane datum spatne. Jako priklad muze byt vlozeni data 30.2.2000, po ulozeni do Date a nacteni dostanu 2.3.2000, coz je jine datum => puvodni je chybne.
peta
Profil *
Jendulus
souhlas se zivan, pouzil bych podobny regularni vyraz (jenom bych vyloucil moznost mit 0-0-00)
Ale pak je treba jeste osetrit dny a mesice, coz je dalsi uprava regularniho vyrazu. A i pak je mozne zadat 31-07-2001.
Takze pro uplny regularni vyraz bys musel pohledat na inetu a jestli je tam treba nejak osetreny i prechodny rok?

Nicmene jednoducha konstrukce by mohla vypadat asi nejak takto, bez osetreni:
^[0-9]{1,2}[\W\D][0-9]{1,2}[\W\D][0-9]{2,4}$
kde bych uvazoval jakykoli oddelovac, ktery nema znaky wordu ani digit

regexlib.com
zivan
Profil
No ja si moc neumim predstavit regularni vyraz, ktery by testoval i pocet dnu v mesici a prestupny rok. Teda pokud to nema byt vyraz s vyctem mnoha kombinaci.
habendorf
Profil
Myslím že už to Jenduluse moc nezajímá :o)
zivan
Profil
jj, vsimnul jsem si, ze jsem se ani nevim jak dostal na stary dotaz...treba nekdo pouzije priste vyhledavani , najde si to a nebude se opakovane ptat :-)
peta
Profil *
zivan
Ano, vycet kombinaci. Rikam, je to slozitejsi :)
Ale jednoducha vec:
(3[0-1]|[1-2][0-9]|0[1-9]) ... a uz muzou byt dny jen 01-31
(1[0-2]|0[1-9]) ... a uz muzou byt mesice jen 01-12
^(3[0-1]|[1-2][0-9]|0[1-9])[\W\D](1[0-2]|0[1-9])[\W\D][0-9]{2,4}$
Je to malinko delsi, ale myslim si, ze stale lepsi mit 31.7. nez 99.99.9999 :)
atom
Profil *
Tohle sem našel na http://swatelier.info/at/clanky/form3.htm:

var mList = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
function checkDateCZ(value) {
if(value == "") return false;
var dt = value.split(".");
if(dt.length != 3) return false;
if(!dt[0] || !dt[1] || !dt[2]) return false;
if(isNaN(dt[0]) || isNaN(dt[1]) || isNaN(dt[2])) return false;
if(dt[2]>2040 || dt[2]<1990) return false;
if(parseInt(dt[1])>12 || parseInt(dt[1])<1) return false;
if(dt[2]/4 == parseInt(dt[2]/4))
{ mList[1] = 29; }
else
{ mList[1] = 28; }
if(dt[0] > mList[dt[1]-1] || dt[0] < 1) return false;
return true;
}

Docela šikovný:)
zivan
Profil
Me to pripada zbytecne "slozity" testovani, kdyz se da vyuzit funkcnost objektu Date.

Napsal bych to bud bez vyjimek s regularnim vyrazem:

function testDateCZ(value)
{
if (!value.match(/^[0-3]?[1-9][./-][01]?[0-9][./-][0-9]{2,4}$/)) return false;
var d = value.split(/[.-]/);
if (d.length != 3) return false;
var d2 = new Date(d[2], d[1]-1, d[0]);
return((d[2] == ""+d2.getFullYear()) && (d[1] == ""+(d2.getMonth()+1)) && (d[0] == ""+d2.getDate()));
}

Nebo s vyuzitim vyjimek:

function testDateCZ(value)
{
var d = value.split(/[.-]/);
if (d.length != 3) return false;
try{
var d2 = new Date(d[2], d[1]-1, d[0]);
return((d[2] == ""+d2.getFullYear()) && (d[1] == ""+(d2.getMonth()+1)) && (d[0] == ""+d2.getDate()));
}
catch(err)
{return false;}
}

Edit: oprava preklepu
Joker
Profil
překlepík:
cache(err) má být catch(err)

Jinak koukám, že tohle téma už podruhé vstalo z mrtvých :o)
peta
Profil *
ja bych jen pripomnel odpoved:
Tomik Člen Zasláno: 29.11.2004 12:49:34
Pokud používáš PHP tak, tam se to řeší jednou jedinou funkcí (CheckDate).

zivan
Prestupny rok v naprostem klidu. vse je zalezitost pricitani, zaokrouhlovani a deleni.
zivan
Profil
2 peta:
Kdyby ses poradne podival, tak bys zjistil, ze jsme v diskusi o javascriptu, takze vykriky o PHP jsou uplne mimo.

Ja jsem napsal verzi, ktera mi pripada elegantnejsi. O tom, ze by byl problem zjistovat prestupny rok scitanim, zaokrouhlovanim a delenim nepadlo ani slovo. Pokud jsi reagoval na moji odpoved z 18.8.06, tak tam slo o regularni vyraz.

Takze tvuje odpoved je naprosto zbytecna a nejaky moderator by ji mohl spolecne i s touto moji reakci smazat.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0