Avatar billede macho Praktikant
19. september 2004 - 14:21 Der er 21 kommentarer og
1 løsning

Mere dato-validering

Jeg har to felter med dato-validering: "Firstinput" og "Secondinput". Valideringen ser således ud:


    regex =/^(3[01]|0[0-9]|[12]\d)\/(0[1-9]|1[012])\/\d{4}/;
    dato1 = "0"

    //Check for firstinput
    dat = document.frmEnquiry.firstinput.value;
    if (dat == ""||!regex.test(dat)){
        errorMsg += "\n\tFørste overnatning \t- Indtast første nat i dette format: (DD/MM/ÅÅÅÅ)\n";
    }else{
      dat = dat.split("/");
      var tdate = new Date(parseInt(dat[2],10),parseInt(dat[1],10)-1,parseInt(dat[0],10));
      if (tdate.getDate()!=parseInt(dat[0],10)||tdate.getMonth()+1!=parseInt(dat[1],10)||tdate.getFullYear()!=parseInt(dat[2],10)){
        errorMsg += "\n\tFørste overnatning \t- Ugyldig dato (DD/MM/ÅÅÅÅ)\n";
      }else{dato1=tdate.getTime();
        var chdato = new Date().getTime()+ (24*60*60*1000);
        if (chdato>dato1)
          errorMsg += "\n\tFørste overnatning \t- Når du benytter denne formular,\n\t\t\t  kan du tidligst bestille to dage frem\n"
      };
    }

   
   
    //Check for secondinput
    dat = document.frmEnquiry.secondinput.value;
//    alert(dat);
    if (dat == ""||!regex.test(dat)){
        errorMsg += "\n\tSidste overnatning \t- Indtast sidste nat i dette format: (DD/MM/ÅÅÅÅ)\n";
    }else{
      dat = dat.split("/");
      var tdate = new Date(parseInt(dat[2],10),parseInt(dat[1],10)-1,parseInt(dat[0],10));
      if (tdate.getDate()!=parseInt(dat[0],10)||tdate.getMonth()+1!=parseInt(dat[1],10)||tdate.getFullYear()!=parseInt(dat[2],10)){
        errorMsg += "\n\tSidste overnatning \t- Ugyldig dato (DD/MM/ÅÅÅÅ)\n";
      }else{
          if(dato1>tdate.getTime())
              errorMsg += "\n\tSidste overnatning \t- Dato kan ikke være tidligere end første nat\n"
          }
     
    }


Ovenstående validering tjekker - bl.a. - for, om der i "Firstinput" ikke indtastes en dato tidligere end om to dage (altså to dage frem fra i dag). I "Secondinput" tjekkes der bl.a. for, om indtastet dato ikke er tidligere end datoen i "Firstinput"-feltet! Så langt så godt!

Det jeg gerne vil have mulighed for at tilføje er, at der i begge felter yderligere skal valideres for indtastede datoer, som ligger længere ude i fremtiden end et halvt år! Hvis datoen ligger mere end et halvt år fremme, skal der komme alert!

Hvem kan hjælpe med det?

Hvem kan hjælpe med det?
Avatar billede roenving Novice
19. september 2004 - 16:44 #1
Hvad er et halvt år ?-)

Er det 6 måneder frem eller er det om 182 dage ?o]
Avatar billede macho Praktikant
19. september 2004 - 16:51 #2
Tjah.....!

Det er faktisk ikke så forfærdeligt afgørende om det er det ene eller det andet. Men for at være på den sikre side, må det jo nok blive 183 dage, da det er nøjagtig halvdelen af et skudår! :-)
Avatar billede macho Praktikant
19. september 2004 - 16:54 #3
Men igen: 6 måneder må jo også betegnes som nøjagtigt et halvt år, så for mig er det som sagt uden betydning, hvordan det regnes!
Avatar billede roenving Novice
19. september 2004 - 16:56 #4
regex =/^(3[01]|0[0-9]|[12]\d)\/(0[1-9]|1[012])\/\d{4}/;
    dato1 = "0"

    //Check for firstinput
    dat = document.frmEnquiry.firstinput.value;
    if (dat == ""||!regex.test(dat)){
        errorMsg += "\n\tFørste overnatning \t- Indtast første nat i dette format: (DD/MM/ÅÅÅÅ)\n";
    }else{
      dat = dat.split("/");
      var tdate = new Date(parseInt(dat[2],10),parseInt(dat[1],10)-1,parseInt(dat[0],10));
      if (tdate.getDate()!=parseInt(dat[0],10)||tdate.getMonth()+1!=parseInt(dat[1],10)||tdate.getFullYear()!=parseInt(dat[2],10)){
        errorMsg += "\n\tFørste overnatning \t- Ugyldig dato (DD/MM/ÅÅÅÅ)\n";
      }else{dato1=tdate.getTime();
        var chdato = new Date().getTime()+ (24*60*60*1000);
        if (chdato>dato1)
          errorMsg += "\n\tFørste overnatning \t- Når du benytter denne formular,\n\t\t\t  kan du tidligst bestille to dage frem\n"
      }else{
        var chdato = new Date().getTime()+ (183*24*60*60*1000);
        if (chdato<dato1)
          errorMsg += "\n\tFørste overnatning \t- Når du benytter denne formular,\n\t\t\t  kan du højst bestille et halvt år frem\n"
      };
    }

   
   
    //Check for secondinput
    dat = document.frmEnquiry.secondinput.value;
//    alert(dat);
    if (dat == ""||!regex.test(dat)){
        errorMsg += "\n\tSidste overnatning \t- Indtast sidste nat i dette format: (DD/MM/ÅÅÅÅ)\n";
    }else{
      dat = dat.split("/");
      var tdate = new Date(parseInt(dat[2],10),parseInt(dat[1],10)-1,parseInt(dat[0],10));
      if (tdate.getDate()!=parseInt(dat[0],10)||tdate.getMonth()+1!=parseInt(dat[1],10)||tdate.getFullYear()!=parseInt(dat[2],10)){
        errorMsg += "\n\tSidste overnatning \t- Ugyldig dato (DD/MM/ÅÅÅÅ)\n";
      }else{
          if(dato1>tdate.getTime())
              errorMsg += "\n\tSidste overnatning \t- Dato kan ikke være tidligere end første nat\n"
      }else{
        var chdato = new Date().getTime()+ (183*24*60*60*1000);
        if (chdato>dato1)
          errorMsg += "\n\tSidste overnatning \t- Når du benytter denne formular,\n\t\t\t  kan du højst bestille et halvt år frem\n"
      };

    }

-- og jeg har ikke testet det !-)
Avatar billede macho Praktikant
19. september 2004 - 17:08 #5
Nej, der må være noget galt. Ingen felter i formularen bliver nu ikke længere valideret.
Avatar billede roenving Novice
19. september 2004 - 17:15 #6
Næh, det kan jeg godt se ved at kigge lidt nærmere (for meget cut and paste !-)

-- der udstedes stadig ikke garantier, for jeg gider ikke at opbygge den tilhørende form for at teste igennem (det har jeg vist også haft fat i engang tidligere !-)

regex =/^(3[01]|0[0-9]|[12]\d)\/(0[1-9]|1[012])\/\d{4}/;
    dato1 = "0"

    //Check for firstinput
    dat = document.frmEnquiry.firstinput.value;
    if (dat == ""||!regex.test(dat)){
        errorMsg += "\n\tFørste overnatning \t- Indtast første nat i dette format: (DD/MM/ÅÅÅÅ)\n";
    }else{
      dat = dat.split("/");
      var tdate = new Date(parseInt(dat[2],10),parseInt(dat[1],10)-1,parseInt(dat[0],10));
      if (tdate.getDate()!=parseInt(dat[0],10)||tdate.getMonth()+1!=parseInt(dat[1],10)||tdate.getFullYear()!=parseInt(dat[2],10)){
        errorMsg += "\n\tFørste overnatning \t- Ugyldig dato (DD/MM/ÅÅÅÅ)\n";
      }else{dato1=tdate.getTime();
        var chdato = new Date().getTime()+ (24*60*60*1000);
        if (chdato>dato1){
          errorMsg += "\n\tFørste overnatning \t- Når du benytter denne formular,\n\t\t\t  kan du tidligst bestille to dage frem\n"
        }else{
          chdato = new Date().getTime()+ (183*24*60*60*1000);
          if (chdato<dato1)
            errorMsg += "\n\tFørste overnatning \t- Når du benytter denne formular,\n\t\t\t  kan du højst bestille et halvt år frem\n"
        }
      }
    }

   
   
    //Check for secondinput
    dat = document.frmEnquiry.secondinput.value;
//    alert(dat);
    if (dat == ""||!regex.test(dat)){
        errorMsg += "\n\tSidste overnatning \t- Indtast sidste nat i dette format: (DD/MM/ÅÅÅÅ)\n";
    }else{
      dat = dat.split("/");
      var tdate = new Date(parseInt(dat[2],10),parseInt(dat[1],10)-1,parseInt(dat[0],10));
      if (tdate.getDate()!=parseInt(dat[0],10)||tdate.getMonth()+1!=parseInt(dat[1],10)||tdate.getFullYear()!=parseInt(dat[2],10)){
        errorMsg += "\n\tSidste overnatning \t- Ugyldig dato (DD/MM/ÅÅÅÅ)\n";
      }else{
        if(dato1>tdate.getTime()){
            errorMsg += "\n\tSidste overnatning \t- Dato kan ikke være tidligere end første nat\n"
        }else{
          var chdato = new Date().getTime()+ (183*24*60*60*1000);
          if (chdato>dato1)
            errorMsg += "\n\tSidste overnatning \t- Når du benytter denne formular,\n\t\t\t  kan du højst bestille et halvt år frem\n"
        }
      }

    }
Avatar billede macho Praktikant
19. september 2004 - 17:23 #7
Ja, du har skam haft fat i den flere gange, men årsagen er, at jeg er blevet bedt om at ændre formularen til det jeg nu efterspørger.

Men nu virker det jo også - takker endnu en gang!
Giv mig et svar, så er pts. dine!
Avatar billede roenving Novice
19. september 2004 - 17:26 #8
Velbekomme '-)

-- ja, den er i hvert fald så speciel, at den kan genkendes !o]

-- og jeg ville nok lave nogle detaljer anderledes idag, men netop detaljer (f.eks. ville jeg bruge mine egne Date()-udvidelser til at producere andre datoer !-)
Avatar billede macho Praktikant
19. september 2004 - 17:42 #9
Ja, speciel er den skam, men den virker skam helt efter hensigten nu!
Avatar billede roenving Novice
19. september 2004 - 17:48 #10
Tak for point ;~}
Avatar billede macho Praktikant
19. september 2004 - 21:11 #11
Jeg beklager roenving :-( Jeg var lidt hurtigt ude med at acceptere dit forsøg!
Der er stadig noget galt. Der valideres helt fint efter hensigten i feltet "firstinput", men det bliver ikke gjort rigtigt i "secondinput". Der tjekkes stadig på at dato ikke er tidligere end første nat, men uanset hvilken dato jeg indtaster i "secondinput", så tjekkes der som om der er fejl. Et eksempel:

datoen 10/01/2004 indtastes i "firstinput"
datoen 20/01/2004 indtastes i "secondinput"

Begge datoer ligger jo fint indenfor det accepterede, men dette valideringen kommer med felbeskeden:
"Sidste overnatning  Når du benytter denne formular, kan du højst bestille et halvt år frem"

Mon du kan rette på dette, roenving?
Avatar billede roenving Novice
19. september 2004 - 21:17 #12
Hov, der er jo en større end, som ikke er blevet rettet til en mindre end !-)

-- den samme linje skal naturligvis være i slutningen af begge blokke:

          if (chdato<dato1)

-- og ikke større end ,-(
Avatar billede macho Praktikant
19. september 2004 - 21:24 #13
Åh - det er nu ikke helt rigtigt. Hvis de er éns i slutningen af begge blokke virker det stadig ikke efter hensigten.
-- Dette skal stå i slutningen af den sidste blok:

    if (chdato<tdate.getTime())

-- denne linje:
    if (chdato<dato1)

skal kun stå i første blok! Har fået det til at virke på den måde! Du kan evt. se min test-form her:
http://www.staal-larsen.dk/mail3/reservation.html

men takker for hjælpen igen ;-)
Avatar billede roenving Novice
19. september 2004 - 21:26 #14
Selvfølgelig !-)
Avatar billede macho Praktikant
22. september 2004 - 13:58 #15
Mon det er muligt - i ovenstående validering, at tilføje muligheden for, at der ikke accepteres reservering i bestemte perioder, f.eks. fra 20/12/2004-01/01/2005

Tildeler yderligere 50 pts. til dette spørgsmål!
Avatar billede roenving Novice
22. september 2004 - 14:17 #16
Kommer an på hvordan du vil definere det !-)

Umiddelbart vil den nemmeste metode være at lave en lille regExp, som reagerer på en start eller slutdato i sådan et område:

var noreservation = /^((2\d|3[01])\/12\/2004|01\/01\/2005)$/;

if(noreservation.test(dat)){
  alert('Ingen reservationer i julen !-)');
}
Avatar billede macho Praktikant
22. september 2004 - 14:30 #17
Hele valideringen for "firstinput" ser således ud nu:

    regex =/^(3[01]|0[0-9]|[12]\d)\/(0[1-9]|1[012])\/\d{4}/;
    dato1 = "0"

    //Check for firstinput
    dat = document.frmEnquiry.firstinput.value;
    if (dat == ""||!regex.test(dat)){
        errorMsg += "\n\tFørste overnatning \t- Indtast første nat i dette format: (DD/MM/ÅÅÅÅ)\n";
    }else{
      dat = dat.split("/");
      var tdate = new Date(parseInt(dat[2],10),parseInt(dat[1],10)-1,parseInt(dat[0],10));
      if (tdate.getDate()!=parseInt(dat[0],10)||tdate.getMonth()+1!=parseInt(dat[1],10)||tdate.getFullYear()!=parseInt(dat[2],10)){
        errorMsg += "\n\tFørste overnatning \t- Ugyldig dato (DD/MM/ÅÅÅÅ)\n";
      }else{dato1=tdate.getTime();
        var chdato = new Date().getTime()+ (24*60*60*1000);
        if (chdato>dato1){
          errorMsg += "\n\tFørste overnatning \t- Når du benytter denne formular,\n\t\t\t  kan du tidligst bestille to dage frem\n"
      }else{
        var noreservation = /^((2\d|3[01])\/12\/2004|01\/01\/2005)$/;
        if(noreservation.test(dat)){
        errorMsg += "\n\tFørste overnatning \t- Ingen reservering i julen\n"
        }else{
          var chdato = new Date().getTime()+ (182*24*60*60*1000);
          if (chdato<dato1)
            errorMsg += "\n\tFørste overnatning \t- Når du benytter denne formular,\n\t\t\t  kan du højst bestille et halvt år frem\n"
        }
      }
      }
    }


Men den tjekker ikke på "noreservation"-datoerne ??
Avatar billede roenving Novice
22. september 2004 - 14:39 #18
Jeg lavede lige lidt oprydning, så det er lettere at gennemskue flowet, for jeg får umiddelbart rigtige reaktioner på den tidligere lagte !-)

    var regex =/^(3[01]|0[0-9]|[12]\d)\/(0[1-9]|1[012])\/\d{4}/;
    dato1 = "0"
    var chdato1 = new Date().getTime()+ (182*24*60*60*1000);
    var chdato2 = new Date().getTime()+ (24*60*60*1000);
    var noreservation = /^((2\d|3[01])\/12\/2004|01\/01\/2005)$/;

    //Check for firstinput
    dat = document.frmEnquiry.firstinput.value;
    if (dat == ""||!regex.test(dat)){
        errorMsg += "\n\tFørste overnatning \t- Indtast første nat i dette format: (DD/MM/ÅÅÅÅ)\n";
    }else{
      dat = dat.split("/");
      var tdate = new Date(parseInt(dat[2],10),parseInt(dat[1],10)-1,parseInt(dat[0],10));
      if (tdate.getDate()!=parseInt(dat[0],10)||tdate.getMonth()+1!=parseInt(dat[1],10)||tdate.getFullYear()!=parseInt(dat[2],10)){
        errorMsg += "\n\tFørste overnatning \t- Ugyldig dato (DD/MM/ÅÅÅÅ)\n";
      }else if (chdato1>tdate.getTime()){
        errorMsg += "\n\tFørste overnatning \t- Når du benytter denne formular,\n\t\t\t  kan du tidligst bestille to dage frem\n"
      }else if(noreservation.test(dat)){
        errorMsg += "\n\tFørste overnatning \t- Ingen reservering i julen\n"
      }else if (chdato2<dato1)
            errorMsg += "\n\tFørste overnatning \t- Når du benytter denne formular,\n\t\t\t  kan du højst bestille et halvt år frem\n"
    }
Avatar billede macho Praktikant
22. september 2004 - 14:54 #19
Okay, jeg har nu indsat din kode, efter oprydning, men hvis jeg f.eks. vil reservere 28/12/2004 kommer fejlbeskeden:
"Når du benytter denne formular, kan du højst bestille et halvt år frem"

Reserverer jeg 01/10/2004 kommer fejlbeskeden:
"Når du benytter denne formular, kan du højst bestille to dage frem"

Der er vist noget helt galt?
Avatar billede macho Praktikant
22. september 2004 - 14:54 #20
rettelse til min sidste:
Reserverer jeg 01/10/2004 kommer fejlbeskeden:
"Når du benytter denne formular, kan du TIDLIGST bestille to dage frem"
Avatar billede macho Praktikant
23. september 2004 - 00:06 #21
Jeg har prøvet at rode lidt rundt med det hele og er kommet til nedenstående resultat, som virker helt som det skal. Jeg kunne egentlig godt tænke mig at vide lidt mere om, hvordan man ændrer datoerne heri: "var noreservation = /^((2\d|3[01])\/12\/2004|01\/01\/2005)$/;" Det er lidt volapyk for mig!


Nå, men som sagt så virker det med nedenstående validering.


    regex =/^(3[01]|0[0-9]|[12]\d)\/(0[1-9]|1[012])\/\d{4}/;
    var noreservation = /^((2\d|3[01])\/12\/2004|01\/01\/2005)$/;
    dato1 = "0"
    var chdato1 = new Date().getTime()+ (24*60*60*1000);
    var chdato2 = new Date().getTime()+ (182*24*60*60*1000);

    //Check for firstinput
    dat = document.frmEnquiry.firstinput.value;
    if(noreservation.test(dat)){
        errorMsg += "\n\tFørste overnatning \t- Ingen reservering i julen/nytåret\n"
    }else if (dat == ""||!regex.test(dat)){
        errorMsg += "\n\tFørste overnatning \t- Indtast første nat i dette format: (DD/MM/ÅÅÅÅ)\n";
    }else{
      dat = dat.split("/");
      var tdate = new Date(parseInt(dat[2],10),parseInt(dat[1],10)-1,parseInt(dat[0],10));
      if (tdate.getDate()!=parseInt(dat[0],10)||tdate.getMonth()+1!=parseInt(dat[1],10)||tdate.getFullYear()!=parseInt(dat[2],10)){
        errorMsg += "\n\tFørste overnatning \t- Ugyldig dato (DD/MM/ÅÅÅÅ)\n";
      }else{dato1=tdate.getTime();
          if (chdato1>dato1){
          errorMsg += "\n\tFørste overnatning \t- Når du benytter denne formular,\n\t\t\t  kan du tidligst bestille to dage frem\n"
        }else if (chdato2<dato1)
            errorMsg += "\n\tFørste overnatning \t- Når du benytter denne formular,\n\t\t\t  kan du højst bestille et halvt år frem\n"
        }
      }


    var chdato3 = new Date().getTime()+ (182*24*60*60*1000);
   
    //Check for secondinput
    dat = document.frmEnquiry.secondinput.value;
    if(noreservation.test(dat)){
        errorMsg += "\n\tSidste overnatning \t- Ingen reservering i julen/nytåret\n"
    }else if (dat == ""||!regex.test(dat)){
        errorMsg += "\n\tSidste overnatning \t- Indtast sidste nat i dette format: (DD/MM/ÅÅÅÅ)\n";
    }else{
      dat = dat.split("/");
      var tdate = new Date(parseInt(dat[2],10),parseInt(dat[1],10)-1,parseInt(dat[0],10));
      if (tdate.getDate()!=parseInt(dat[0],10)||tdate.getMonth()+1!=parseInt(dat[1],10)||tdate.getFullYear()!=parseInt(dat[2],10)){
        errorMsg += "\n\tSidste overnatning \t- Ugyldig dato (DD/MM/ÅÅÅÅ)\n";
      }else if(dato1>tdate.getTime()){
            errorMsg += "\n\tSidste overnatning \t- Dato kan ikke være tidligere end første nat\n"
        }else if (chdato3<tdate.getTime())
            errorMsg += "\n\tSidste overnatning \t- Når du benytter denne formular,\n\t\t\t  kan du højst bestille et halvt år frem\n"
        }
Avatar billede macho Praktikant
23. september 2004 - 00:08 #22
Rønving -> Du kan få din 50 pts. ved at gi' et svar her:
http://www.eksperten.dk/spm/542708

takker for hjælpen - igen, igen... ;-)
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