site logo

Validace datumu

Ověření platnosti českým způsobem zapsaného datumu je složitější, protože se uplatňují národní zvyklosti zápisu. Ukážeme si rozdíly ve validaci v browseru pomocí JavaScriptu a na serveru pomocí Ajaxu. Většinou příklady pro validaci datumu předpokládají zápis v americkém stylu, který se liší od českého pořadím dne a měsíce a oddělovacími znaky.

Jako validní datum lze považovat takový zápis, který oba skripty klientský i serverový vyhodnotí jako platný a po přetypování na datový typ datetime a zpět na řetězec dostaneme stejné datum (nikoli nutně ve stejném formátu). Použití datového typu datetime je naprostou nutností když datum je použito pro vyhledávání, nebo výpočet (počet záznamů za určité období, délka prostoje).

Testovací formulář a skripty

české datum browser server

Do miniformuláře zapíšete datum, kliknutím na tlačítko test se spustí ověření správnosti údaje. Nejdříve jej vyhodnotí JavaScript v browseru, pak je údaj zaslán k validaci na server pomocí Ajaxu.

Ověření JavaScriptem je způsobem ano/ne, server vrátí přetypovaný údaj, nebo oznámení o chybě.

Validace na serveru je provedena jinou funkcí a proto výsledky nejsou shodné. Pro možnost uložit data do databáze ve správném datovém typu je rozhodující validace na straně serveru. V tomto případě je na straně serveru classic.asp a národní prostředí je nastaveno podle českých pravidel. V jiném prostředí se výsledky mohou lišit. Zkuste vložit datum "1.13.2008", nebo "22 leden 1947" pro porovnání rozdílů. Serverový script totiž rozumí českým názvům měsíců, to je dáno nastaveným národním prostředím.

Následuje ukázka kódu pro validaci datumu pomocí JavaScriptu na straně klienta.


<script type="text/javascript">
// ---------- validace klientem pomocí JavaScriptu -----------
function testDate() {
  var dtStr = document.getElementById("dtInp").value;
  if (checkDate(dtStr) == true)
    document.getElementById("testClient").innerHTML = "O.K.";
  else
    document.getElementById("testClient").innerHTML = "error";
}

function checkDateEU(value) {
  if(value == "") return false;
  var dtArr = value.split(".");
  if(dtArr.length != 3) return false;
  var dx = new Date(dtArr[2], dtArr[1]-1, dtArr[0]);
  if(dx.getDate() != dtArr[0]) return false;
  if(dx.getMonth()+1 != dtArr[1]) return false;
  return true;
}
</script>

První funkce pro ověření datumu na straně klienta je pomocná funkce. Získá hodnotu formulářového prvku se zapsaným datumem a zajistí předání zprávy o výsledku validace.

Druhá funkce je ověření českého datumu. Vrací hodnoty true, nebo false. Nejdříve je údaj datumu rozložen podle oddělovacího znaménka (zde tečka) do pole obsahující den, měsíc, rok. Hodnoty jsou použity pro vytvoření objektu Date, který zohlední počty dnů v měsíci, přestupné roky ap. Původní hodnoty dne a měsíce se musí shodovat s hodnotami z objektu Date.

Následuje ukázka kódu pro validaci datumu pomocí Ajaxu.


<script type="text/javascript">
// ---------- validace serverem pomocí AJAX -------------
var req;
function serverValidate() {
  var inp = document.getElementById("dtInp").value
  var URL = ".../validateDate.asp?dt=" + escape(inp);
  if (window.XMLHttpRequest) {     // IE7, FF, Opera, ...
    req = new XMLHttpRequest();
  }
  else if (window.ActiveXObject) { // <=IE6
    req = new ActiveXObject("Microsoft.XMLHTTP");
  }
  if(req) {
    req.onreadystatechange = processReq;
    req.open("GET", URL, true);
    req.send(null);
  } 
}

function processReq() {
  if(req.readyState == 4) {
    if(req.status == 200) {
      document.getElementById("testServer").innerHTML = req.responseText;
    }
  }
}
</script>

První funkce serverValidate() vyzvedne z formulářového pole, připraví adresu serverového skriptu a připojí zakódovaný queryString s hodnotou datumu, který bude serverový skript testovat. Zakódování údaje pomocí funkce escape je zde pro případ, že do vstupního pole budete zadávat české názvy měsíců, to znamená text s diakritikou. Takové znaky potřebují zakódovat pomocí escape sekvence. Podle typu browseru je vytvořen AJAX objekt, dále je nastavena funkce pro příjem odpovědi a dotaz je odeslán.

Druhá funkce processReq() čeká na odpověď serveru. Jakmile přijde datová zpráva, funkce zajistí vypsání výsledku validace. Ukázka kódu je pro ilustraci principu validace pomocí AJAXu, nikoli kód připravený pro validaci celého formuláře.


<%
' --- serverový skript (ASP classic) validace datumu pomocí AJAX ---
Option Explicit
Response.Buffer = false

Dim dt

Call Response.AddHeader("Cache-Control", "no-cache")
If IsDate(request("dt")) Then
  dt = CDate(request("dt"))
  Response.Write FormatDateTime(dt, vbShortDate)
Else
  Response.Write "error"
End If
%>

Pro úplnost je uveden i serverový skript pro validaci. Zde je použito classic.asp a VBScript. Všimněte si, že je zasílán jen prostý text, bez použití sekcí typu html, head, nebo body.

Dále je uvedena jiná varianta kódu JavaScriptu pro validaci datumu a času. Skript je delší než první příklad, ale umožnil by podrobnější určení případné chyby v zápisu datumu.


<script type="text/javascript">

var mList = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
function checkDateEU(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;
}
function checkHour(value) {
  if(value == "") return false;
  var dt = value.split(":");
  if(dt.length != 2) return false;
  if(!dt[0] || !dt[1]) return false;
  if(isNaN(dt[0]) || isNaN(dt[1])) return false;
  if(parseInt(dt[0])>23 || parseInt(dt[0])<0) return false;
  if(parseInt(dt[1])>59 || parseInt(dt[1])<0) return false;
  return true;
}
</script>

updated 08.12.2007