Avatar billede jtc Nybegynder
16. februar 2004 - 20:08 Der er 18 kommentarer og
1 løsning

Simpel validering af dato

Hej er det nogen der kan hjælpe mig med at validere et datofelt på formen
16-02-2004 16:15:00
Avatar billede satanic_raven Nybegynder
17. februar 2004 - 01:54 #1
Du vil ha' et script som tjekker for det nævnte format... Eller hva???

S.R.
Avatar billede o-zone Nybegynder
17. februar 2004 - 10:42 #2
Ja skide simpelt blev det jo altså ikke, men prøv at putte det her i head:
---8<----------
<script language="javascript" type="text/javascript">
    function isSkudAAr(y){
        if (y<1700) { return false; }
        y = y-1700;
        if (y%400==0) { return true; }
        if (y%100==0) { return false; }
        if (y%4==0) { return true; }
        return false;
    }
   
    function validerDato(str){
        // test pattern
        var pattern = /^(\d{2}\-){2}\d{4}\s(\d{2}\:){2}\d{2}$/;
        if (!pattern.test(str)) { return "Strengen er af forkert format"; }
       
        // ekstract numbers
        var tmpArray = str.split(" ");
        var datoStr = tmpArray[0];
        var tidStr = tmpArray[1];
        var datoArray = datoStr.split("-");
        var tidArray = tidStr.split(":");
        var dato = parseInt(datoArray[0]);
        var month = parseInt(datoArray[1]);
        var year = parseInt(datoArray[2]);
        var hours = parseInt(tidArray[0]);
        var minutes = parseInt(tidArray[1]);
        var seconds = parseInt(tidArray[2]);
        var skudAAr = isSkudAAr(year);
       
        //test month
        if ((month<01)||(month>12)) { return "måned er forkert"; }
       
        //test dato
        if (dato<1) { return "for lav dato" }
        if ((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12)){
            // 31 days month
            if (dato>31) { return "der er kun 31 dage i måned "+month; }
        } else if ((month==4)||(month==6)||(month==9)||(month==11)){
            // 30 days month
            if (dato>30) { return "der er kun 30 dage i måned "+month; }
        } else {
            // feb
            if (skudAAr){
                if (dato>29) { return "der er kun 29 dage i feb på skudår" }
            } else {
                if (dato>28) { return "der er kun 28 dage i feb på almindelige år" }
            }
        }
       
        // test hours
        if ((hours<0)||(hours>23)) { return "time er forkert"; }
       
        // test minutes
        if ((minutes<0)||(minutes>59)) { return "minutter er forkerte"; }

        // test seconds
        if ((seconds<0)||(seconds>59)) { return "sekunder er forkerte"; }
       
        // nothing went wrong
        return "er en valid dato!";
    }
</script>
---8<----------

og det her i body (til at teste :) )
---8<----------
<script language="javascript" type="text/javascript">
    var eksempelDatoer = ["16-02-2004 16:15:00","29-02-2004 16:15:00",
                          "29-02-2005 16:15:00","16-13-2004 16:15:00",
                          "blob","29-02-2100 16:15:00","29-02-1900 16:15:00",
                          "31-01-2004 16:15:00","31-04-2004 16:15:00",
                          "00-07-2004 16:15:00","31-04-2004 00:15:00",
                          "31-01-2004 16:15:00","30-04-2004 16:60:00"
                          ];

    for (var i=0;i<eksempelDatoer.length;i++){
        document.write(eksempelDatoer[i]+" - "+validerDato(eksempelDatoer[i])+"<br>");
    }
</script>
---8<----------

(-:H@zze
Avatar billede o-zone Nybegynder
17. februar 2004 - 10:48 #3
Hvis jeg misforstod opgaven, og du kun ville teste for formatet "DD-MM-YYYY hh:mm:ss", så kan du nøjes med pattern testen:
        var pattern = /^(\d{2}\-){2}\d{4}\s(\d{2}\:){2}\d{2}$/;
        if (!pattern.test(str)) { return "Strengen er af forkert format"; }

...og hvis du ikke ønsker den udpindede forklaring på hvad der er galt, kan du bare bytte alle fejlstrengene ud med false og strengen "er en valid dato!" ud med true.
Så har du en funktion du kan bruge som følger:
  if (validerDato(minDatoStreng))
  {
    hvad der skal ske når datoen er valid
  } else {
    hvad der skal ske når datoen er forkert
  }

(-:H@zze
Avatar billede o-zone Nybegynder
17. februar 2004 - 10:52 #4
hvis ikke dét var 15 points værd... ;-P~
Avatar billede jtc Nybegynder
17. februar 2004 - 11:13 #5
hej o-zone det ser godt ud men kan du få det til at virke i samme funktion som denne her funktion.

<script type="text/JavaScript">
function valider () {
  if ( form1.oprettetdato.value.length > 0 ) {
  } else {
      alert ("Du har glemt af udfylde feltet oprettet den.");
      form1.oprettetdato.focus();
      return false; 
  };

  if ( form1.oprettetaf.value.length > 0 ) {
  } else {
      alert ("Du har glemt af udfylde hvem sagen er oprettet af.");
      form1.oprettetaf.focus();
      return false; 
  };

  form1.submit();
}; 
</script>
Avatar billede satanic_raven Nybegynder
17. februar 2004 - 14:23 #6
Er det her til en ASP side???

For hvis det er, så kan du nøjes med at bruge følgende kode på din submit-side:

rs.date = date()

Tror jeg nok...

S.R.
Avatar billede satanic_raven Nybegynder
17. februar 2004 - 14:25 #7
Glemte lige at sige, at på den måde har du altid det ønskede format...

S.R.
Avatar billede roenving Novice
17. februar 2004 - 16:43 #8
<script type="text/JavaScript">
function valider () {
  if ( form1.oprettetdato.value.length == 0 || !validerDato(form1.oprettetdato.value)) {
      alert ("Du har glemt af udfylde feltet oprettet den.");
      form1.oprettetdato.focus();
      return false; 
  };

  if ( form1.oprettetaf.value.length == 0 ) {
      alert ("Du har glemt af udfylde hvem sagen er oprettet af.");
      form1.oprettetaf.focus();
      return false; 
  };

  form1.submit();
}; 
  function validerDato(str){
    // test pattern
    var pattern = /^(\d{2}\-){2}\d{4}\s(\d{2}\:){2}\d{2}$/;
    if (!pattern.test(str)) { return "Strengen er af forkert format"; }
       
    // ekstract numbers
    var t = str.split(" ");
    var d = t[0].split("-");
    var s = t[1].split(":");
    var dt = new Date(d[2],(+d[1]-1),d[0],s[0],s[1],s[2]);
    return dt.getFullYear()==d[2]&&dt.getMonth()+1==d[1]&&dt.getDate()==d[0]&&dt.getHours()==s[0]&&dt.getMinutes()==s[1]&&dt.getSeconds()!=s[2];
  }
</script>
Avatar billede roenving Novice
17. februar 2004 - 16:45 #9
Hov, linjen skulle være:

    if (!pattern.test(str)) return false;
Avatar billede jtc Nybegynder
17. februar 2004 - 18:22 #10
roenving det virker ikke, den vil slet ikke godkende datoen selvom den er skrevet korrekt
Avatar billede jtc Nybegynder
17. februar 2004 - 18:25 #11
satanic_raven hvor skal jeg skrive det???
Avatar billede roenving Novice
17. februar 2004 - 18:52 #12
En dumme-fejl i return-linjen i validerDato, jeg havde overset en konsekvensrettelse af den sidste sammenligning, som også skulle være == ...

<script type="text/JavaScript">
function valider (f) {
  if ( f.oprettetdato.value.length == 0 || !validerDato(f.oprettetdato.value)) {
      alert ("Du har glemt af udfylde feltet oprettet den.");
      f.oprettetdato.focus();
      return false; 
  };

  if ( f.oprettetaf.value.length == 0 ) {
      alert ("Du har glemt af udfylde hvem sagen er oprettet af.");
      f.oprettetaf.focus();
      return false; 
  };

  //f.submit();
  return true;
}; 
  function validerDato(str){
    // test pattern
    var pattern = /^(\d{2}\-){2}\d{4}\s(\d{2}\:){2}\d{2}$/;
    if (!pattern.test(str)) return false;

    // ekstract numbers
    var t = str.split(" ");
    var d = t[0].split("-");
    var s = t[1].split(":");
    var dt = new Date(d[2],(+d[1]-1),d[0],s[0],s[1],s[2]);
    var ch = dt.getFullYear()==d[2]&&dt.getMonth()+1==d[1]&&dt.getDate()==d[0]&&dt.getHours()==s[0]&&dt.getMinutes()==s[1]&&dt.getSeconds()==s[2];
    return ch;
  }
</script>
Avatar billede jtc Nybegynder
17. februar 2004 - 19:05 #13
jeg kan først tjekke det i morgen
men du har da lavet mere om end blot ==
hvad med f.oprettetdato istedet for form1.oprettetdato
og så er de 4 sidste linier da lavet en del om???
Avatar billede roenving Novice
17. februar 2004 - 19:19 #14
Arh, det er fordi jeg altid kalder med en reference til formen -- det havde jeg ikke lige tænkt på:

<form ... onsubmit="return valider(this)">

-- det kurerer forøvrigt også, at den tidligere forudsætter, at document.all er gyldig !-)

-- og den er kun gyldig i IE4+ og Opera et-eller-andet, så alle andre browsere ville være stået af !-)

-- og for at teste havde jeg brug for en mellemregning, så jeg kunne aflæse, så det kan laves uden ch, så der bare står:

return dt.getFullYear()==d[2]&& ...
  }
</script>
Avatar billede satanic_raven Nybegynder
18. februar 2004 - 12:22 #15
Hvis du vil bruge min mulighed, skal du på den side hvor du sender information til databasen, tilføje linien:

rs("Dato") = date()

Lige over:

rs.update

Det er sådan som jeg har brugt dato'er m.m.

I din database laver du så et felt som hedder "Dato", herefter ændrer du feltets format til det format du ønsker at bruge...

S.R.
Avatar billede jtc Nybegynder
18. februar 2004 - 17:23 #16
satanic_raven det virker ikke
Avatar billede jtc Nybegynder
18. februar 2004 - 17:25 #17
roenving vil du ikke bare sætte det ind i denne formel så det passer med alt det andet jeg har skrevet??

Det skal bare være så jeg kan kopiere det direkte over

<script type="text/JavaScript">
function valider () {
  if ( form1.oprettetdato.value.length > 0 ) {
  } else {
      alert ("Du har glemt af udfylde feltet oprettet den.");
      form1.oprettetdato.focus();
      return false; 
  };

  form1.submit();
}; 
</script>
Avatar billede roenving Novice
18. februar 2004 - 17:31 #18
-- her er den direkte til at kopiere, men jeg har altså gjort den browser-kompatibel med den linje først i koden ...

-- og jeg har ikke forstået, at du absolut vil lave en form.submit() i koden, når farmen automatisk submittes, når du laver en return true !-)

<script type="text/JavaScript">
function valider () {
  f = document.form1;
  if ( f.oprettetdato.value.length == 0 || !validerDato(f.oprettetdato.value)) {
      alert ("Du har glemt af udfylde feltet oprettet den.");
      f.oprettetdato.focus();
      return false; 
  };

  if ( f.oprettetaf.value.length == 0 ) {
      alert ("Du har glemt af udfylde hvem sagen er oprettet af.");
      f.oprettetaf.focus();
      return false; 
  };

  f.submit();
  //return true;
}
  function validerDato(str){
    // test pattern
    var pattern = /^(\d{2}\-){2}\d{4}\s(\d{2}\:){2}\d{2}$/;
    if (!pattern.test(str)) return false;

    // ekstract numbers
    var t = str.split(" ");
    var d = t[0].split("-");
    var s = t[1].split(":");
    var dt = new Date(d[2],(+d[1]-1),d[0],s[0],s[1],s[2]);
    var ch = dt.getFullYear()==d[2]&&dt.getMonth()+1==d[1]&&dt.getDate()==d[0]&&dt.getHours()==s[0]&&dt.getMinutes()==s[1]&&dt.getSeconds()==s[2];
    return ch;
  }
</script>
Avatar billede jtc Nybegynder
02. marts 2004 - 15:18 #19
roenving jeg skal have det så det passer direkte ind i koden, da jeg også har en masse andet der skal valideres
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester