Geldigheid testen van een datum-aanduiding
Hieronder zie een een formuliertje met één tekstveld. Als je daar een Datum-aanduiding invult en dan op de knop Test! drukt, komt er een alert op het scherm die zegt of de datum correct is gevormd of niet.
Op deze pagina staat beschreven hoe je dat aanpakt. De code staat onderaan deze bladzijde. Je kunt hem ook downloaden voor je eigen gebruik.
- Er wordt gekeken of een string een juiste datum-aanduiding bevat. Het ligt voor de hand om hier reguliere expressies voor te gebruiken. Voor dit specifieke geval is dat echter niet handig.
- Je kunt in JavaScript een datum op meerdere manieren opgeven. Dat zou betekenen dat je voor elke manier een regex moet maken en ook nog moet bepalen welke manier is gebruikt. Het is daarom slimmer om de opgegeven string in een datum-variabele te zetten. Als de string een ongeldige datum is krijgt de datum-variabele de waarde NaN (Not a Number). Je kunt daarop testen met de function isNaN(). Zie de code onder aan deze bladzijde.
- Deze aanpak werkt alleen als je je houdt aan de formaten die JavaScript begrijpt:
- maand dag, jaar (Engels/Amerikaanse notatie; maand in het Engels!)
- mm/dd/yy of mm/dd/yyyy
- mm-dd-yy of mm-dd-yyyy. Deze laatste wordt niet geaccepteerd door FireFox. Wees daarop bedacht.
Wat wel werkt: june 10, 2005. De naam van de maand is niet hoofdlettergevoelig.
- De hier gebruikte aanpak heeft een merkwaardig zij-effect: Correct gevormde maar verder ongeldige
datum-aanduidingen worden gewoon geaccepteerd en goedgekeurd. Een datum als June 32, -2005
wordt geïnterpreteerd als July 2, 2005 en dat lijkt correct.
Het is dus nodig om de ingevoerde datum nog verder te onderzoeken nadat deze als "geldig" is aangemerkt. - Bij deze controle worden de ingevoerde maand en dag vergeleken met de maand en dag uit de string-datum
conversie. Hierbij moet gelden:
- Beide maandnummers zijn gelijk. Als de naam van een maand is ingegeven wordt deze naar een nummer geconverteerd.
- Beide dagnummers zijn gelijk.
- Merk op dat de jaartallen er in dit geval niet toe doen
- De string-datum conversie staat het ingeven van negatieve data toe, bijvoorbeeld January -25, -2004.
Het script houdt hier rekening mee.
- Voor het verwijderen van spaties aan het begin en einde van de ingevoerde sring wordt een reguliere expressie
gebruikt. Deze luidt: /(^\s*)|(\s*$)/g
Nadat de ingevoerde string is gesplitst in maand, dag en jaar, worden spaties ook verwijderd bij dag en maand. Hiervoor wordt dezelfde reguliere expressie gebruikt.
Gebruik:
- De code staat gedeeltelijk in de <HEAD> en gedeeltelijk in de <BODY>.
De code ziet er als volgt uit:
(Zet dit in de <HEAD>).
(Zet dit in de <BODY>, op de plaats waar het formulier moet komen)<script>
function TestTheDate() {
// Check de juistheid van de datum-aanduiding. Dit gebeurt gedeeltelijk met een Reguliere Expressie.
if (VerifyDate_check(document.f.t.value)) {
window.alert('De opgegeven datum-aanduiding is correct gevormd...')
} else {
window.alert('De opgegeven datum-aanduiding is NIET correct gevormd!')
document.f.t.focus();
}
}
function VerifyDate_check(str) {
str=str.replace(/(^\s*)|(\s*$)/g, "");
var a = new Date(str);
var b = new Array(), c = new Array();
var d = new Array("january","february","march","april","may","june","july","auguts","september",
"october","november","december");
if (isNaN(a)) { // Als de string geen goede-datum-tijd aanduiding is,
wordt a Not-a-Number
return false;
} else { // String is correct gevormd, kijk of de datum goed is!
Jaartal is voor deze check onbelangrijk
b[0] = a.getMonth() + 1;
b[1] = a.getDate();
if (str.match(' ') && str.match(',')) {
c[0] = str.substring(0,str.indexOf(' ',0));
c[0] = c[0].toLowerCase();
c[1] = str.substring(str.indexOf(' ',0)+1,str.indexOf(',',0));
c[2] = str.substring(str.indexOf(',',0)+1,str.length);
for (i=0; i<12; i++)
if (c[0] == d[i]) c[0] = escape(i + 1); // dit is een string, nog geen integer
} else if (str.match('-') && !str.match('/-')) {
c = str.split('-',-1);
} else if (str.match('/')) {
c = str.split('/',-1);
}
// array c is drie posities...
if (c.length != 3) return false;
// Strip overbodige spaties, maak integers >0 voor dag en maand
for (i=0; i<2; i++) {
c[i] = c[i].replace(/(^\s*)|(\s*$)/g, "");
c[i] = Math.abs(parseInt(c[i]));
b[i] = Math.abs(parseInt(b[i]));
}
// Eindcontrole
for (i=0; i<2; i++)
if (b[i] != c[i]) return false;
return true;
}
}
</script>
<form action="JavaScript:TestTheDate();" name="f" id="f">
<table border="1" cellspacing="1" cellpadding="5" align="center" bgcolor="#DDFFDD" frame="box" rules="none"><tr>
<td colspan="2" align="center">Vul hier een datum-aanduiding (<i>maand dag jaar</i>) in:<br>
<input type="text" name="t" size="30" maxlength="50"></td>
</tr><tr>
<td align="center"><input type="submit" value=" Test! "></td>
<td align="center"><input type="reset" value="Opnieuw..."></td></tr></table></form>
Downloaden:
Druk op de knop:
File: voorb152.zip, 1276 bytes.
Opmerking:
Een script voor het overzetten van het Nederlandse naar het Engelse datum-formaat is beschikbaar: Datum
formaat omzetten