Kalender optel fout!

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • DNA_Saint
  • Registratie: Maart 2004
  • Laatst online: 21-09 19:24

DNA_Saint

Go Go Gadget Ondertitel!

Topicstarter
Ik heb een systeem waarbij de dagen nu fout worden opgeteld.

Om te laten zien wat er fout gaat hier de pagina:
http://tigermedia.nl/klanten/mantravel/hotelboeking/

Kies maar een Datum van vertrekken en vul dan bij Aantal dagen iets in.
Dan zie je de vertrek datum, maar dit gaat dus fout.


De vertrekdatum wordt als volgt berekend (alleen relevante code meegepost):
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function checkDays(id) {
    var obj = document.getElementById(id);


    // nummer is oke
    var startdatumobj = document.getElementById("datumvanvertrek");
    var einddatumobj = document.getElementById("vertrekdatum");
    var parts = startdatumobj.value.split('-');

    var maxDagen = get_maxdagen(parts[2], parts[1]);
    var dag=strip_nul(parts[0]);
    var maand=strip_nul(parts[1]);
    var jaar=strip_nul(parts[2]);


    var dagnummer = parseInt(dag) + parseInt(obj.value) - 1 // We doen -1 omdat we alleen de dagen willen ipv de nachten 
    //bepaal einddatum
    var einddatum = new Date()
        einddatum.setMonth(maand-1)
        einddatum.setFullYear(jaar)
        einddatum.setDate(dagnummer)
    
    //geef einddatum terug
    einddatumobj.value = einddatum.getDate() + "-" + ( einddatum.getMonth() + 1 ) + "-" + einddatum.getFullYear()   
    o(id);
    o("vertrekdatum");
    formobj[id]=true;
    return 2;
}


Bij sommige maanden werkt het goed, maar bij de maanden: Feb, April, Juni, Sept , Nov en December komt er ineens +1 bij de vertrek maand datum.
En als je bij deze maanden op de laatste dag van de maand als begindatum kiest (bijv. 30-06), en dan 5 dagen doet. Dan springt de einddatum ineens een maand verder naar augustus.

Al deze maanden hebben 30 dagen. (behalve februari dan)
Ik zit al de hele ochtend + middag te testen waar de fout nou precies zit. Maar ik ben er nog steeds niet uit.

Snapt iemand van jullie het?

[ Voor 12% gewijzigd door DNA_Saint op 31-03-2009 14:57 ]

Huub Huub Barbatruc!


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Je maakt het lastig om te debuggen. Als je toch aan 't testen bent, heb je niet toevallig een hele simpele testcase? Ik kan nl. niet eens normaal een datum met de hand invullen zonder dat de JS errors me om m'n oren worden geslagen :P

Daarnaast al eens gehoord van: http://www.datejs.com/ (is wel de cheesy methode van oplossen trouwens)?

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • Gersomvg
  • Registratie: December 2005
  • Laatst online: 21-09 16:07
Misschien moet je nog even de code van de functie get_maxdagen hier plakken ;)

Acties:
  • 0 Henk 'm!

  • Mental
  • Registratie: Maart 2000
  • Laatst online: 20-10-2020
Geloof dat de TS het werkend heeft.
Geinig detail is nog wel dat als je 2 dagen weggaat je 29 dagen eerder terugkomt dan dat je vertrekt :P

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
BtM909 schreef op dinsdag 31 maart 2009 @ 14:43:
Daarnaast al eens gehoord van: http://www.datejs.com/ (is wel de cheesy methode van oplossen trouwens)?
Die kende ik nog niet, dat kan best wel eens handig zijn... tnx ;)

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 19:21

Dido

heforshe

Rekenen aan datums wil je niet (herhaal: NIET) zelf implementeren. Dat zijn bewerkingen waarin op honderden manieren dingen fout kunnen gaan, en die al lang en breed in iedere taal zijn uitgewerkt tot in de puntjes, veelal bij mensen die er een stuk beter in zijn dan de gemiddelde programmeur. Gebruik dus de voor de hand liggende functies, calsses of libraries om datums te manipuleren.

Iets anders: voor jou zit er een semantisch verschil tussen datumvanvertrek en vertrekdatum, als in, dat zijn de begin- en einddatum? Als je je code ondoorzichtig wilt maken zijn die namen erg goed gekozen ;)

edit: ik zie nu pas dat juni 31 dagen moet hebben. Dan zullen de meeste standaard datum-handlers inderdaad niet toereikend zijn 8)7

[ Voor 10% gewijzigd door Dido op 31-03-2009 14:53 ]

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 22-09 09:45

Onbekend

...

DNA_Saint schreef op dinsdag 31 maart 2009 @ 14:35:
Bij sommige maanden werkt het goed, maar bij de maanden: Feb, April, Juni, Sept , Nov en December komt er ineens +1 bij de vertrek maand datum.
En als je bij deze maanden op de laatste dag van de maand als begindatum kiest (bijv. 31-06), en dan 5 dagen doet. Dan springt de einddatum ineens een maand verder naar augustus.

Al deze maanden hebben 31 dagen. (behalve februari dan)
De maanden die je zojuist hebt opgenoemd hebben m.u.v. december minder dan 31 dagen hoor. Misschien is het helemaal geen fout. :P

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • DNA_Saint
  • Registratie: Maart 2004
  • Laatst online: 21-09 19:24

DNA_Saint

Go Go Gadget Ondertitel!

Topicstarter
ik ben een testcase aan het maken atm. :)
Dan kunnen jullie precies zien wat ik echt bedoel.

typfoutje van de 31 dagen :p


==============
Testcase is hier te vinden:
http://tigermedia.nl/test/cal/

Het probleem is nu weer verschoven naar naar de 31 dagen maanden...
ik snap er nu helemaal niks meer van.

[ Voor 57% gewijzigd door DNA_Saint op 31-03-2009 15:20 ]

Huub Huub Barbatruc!


Acties:
  • 0 Henk 'm!

  • DNA_Saint
  • Registratie: Maart 2004
  • Laatst online: 21-09 19:24

DNA_Saint

Go Go Gadget Ondertitel!

Topicstarter
oops *dubbelpost*

[ Voor 96% gewijzigd door DNA_Saint op 31-03-2009 15:19 ]

Huub Huub Barbatruc!


Acties:
  • 0 Henk 'm!

  • Mental
  • Registratie: Maart 2000
  • Laatst online: 20-10-2020
Datum van vertrekken
Aantal dagen
Vertrek datum
Dus als ik 10 maart wil vertrekken en ik 5 dagen weg wil.. moet ik 5 maart vertrekken?
Doe serieus eens wat aan die naamgeving want hier help je jezelf ook niet echt mee.

Acties:
  • 0 Henk 'm!

  • Icelus
  • Registratie: Januari 2004
  • Niet online
31 maart + 5 dagen geeft bij mij 4 maart terug.

Komt volgens mij door deze regel:
JavaScript:
1
2
if (maand == 4 || 6) {
  var eindMaand = einddatum.getMonth()
Hier komt toch altijd true uit?

Btw. noem het ‘aankomstdatum’ en ‘vertrekdatum’; veel duidelijker.

[ Voor 49% gewijzigd door Icelus op 31-03-2009 15:31 ]

Developer Accused Of Unreadable Code Refuses To Comment


Acties:
  • 0 Henk 'm!

  • DNA_Saint
  • Registratie: Maart 2004
  • Laatst online: 21-09 19:24

DNA_Saint

Go Go Gadget Ondertitel!

Topicstarter
Zat wat kleine dingen te testen, maar heb een ander bestand gemaakt om te testen en testcase blijft in originele staat.
Naamgeving is veranderd.

Fouten:
Maanden met 30 dagen werken niet goed. Selecteer maar bijv. juni en dan 5 dagen.
Dan komt als vertrekdatum juli uit.
Wanneer ik 30 juni doe, dan komt er augustus uit.

(ik zie eigenlijk niet hoe de DateJs lib mij hiermee kan helpen..?)

[ Voor 47% gewijzigd door DNA_Saint op 31-03-2009 15:43 ]

Huub Huub Barbatruc!


Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Nou heb ik de ballen verstand van javascript, maar als ik een datum kies, dan is de maand bijvoorbeeld 04 en het jaar 2009.
Ziet de get_maxdagen die parts[1] dan wel als 4? of is parts[1] 04 en is de return max dus altijd 31 voor maanden < 10
Daarna doe je pas strip_nul
-edit-
Ik heb even gezocht of er in jacasript ook een julian iets bestaat
Deze site doet precies wat jij wil.

[ Voor 21% gewijzigd door Vaan Banaan op 31-03-2009 16:02 ]

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • kalizec
  • Registratie: September 2000
  • Laatst online: 17-07 01:45
Icelus schreef op dinsdag 31 maart 2009 @ 15:29:
31 maart + 5 dagen geeft bij mij 4 maart terug.

Komt volgens mij door deze regel:
JavaScript:
1
2
if (maand == 4 || 6) {
  var eindMaand = einddatum.getMonth()
Hier komt toch altijd true uit?

Btw. noem het ‘aankomstdatum’ en ‘vertrekdatum’; veel duidelijker.
Hier komt zeker altijd true uit.

De TS heeft de fout gemaakt om AND/OR te gebruiken tussen waardes in in plaats van tussen vergelijkingen.

(maand == 4 || maand == 6) zou daar moeten staan.

Core i5-3570K/ASRock Z75 Pro3/Gigabyte Radeon HD7850/Corsair XMS3 2x4GB/OCZ Vertex2 64GB/3x640GB WD Black/24" B2403WS Iiyama x2/Nec 7200S


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:51

crisp

Devver

Pixelated

Je hoeft helemaal niet moeilijk te doen om dagen op te tellen bij een datum:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
// vertrekdatum
var year = 2009;
var month = 5;
var day = 1;

// Date object aanmaken
var date = new Date(year, month - 1, day);

// aantal dagen optellen
date.setDate(date.getDate() + 14);

// en je Date object instance weer uitlezen
alert(date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate());

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • DNA_Saint
  • Registratie: Maart 2004
  • Laatst online: 21-09 19:24

DNA_Saint

Go Go Gadget Ondertitel!

Topicstarter
ik snap dus echt niet wat ik fout doe.

ik heb nu dit in mijn functie erbij gedaan:
JavaScript:
1
    var aantaldagen = document.getElementById("aantaldagen").value;


en
JavaScript:
1
2
3
4
5
    
    var vertrekdatum = new Date()   
    vertrekdatum.setMonth(maand-1)
    vertrekdatum.setFullYear(jaar)
    vertrekdatum.setDate(dag + parseInt(aantaldagen)); 


Dit maakt het geheel:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function checkDays(id) {
    var obj = document.getElementById(id);
    var err = document.getElementById(id+"_error");
 
    // nummer is oke
    var aankomstdatumobj = document.getElementById("aankomstdatum");
    var vertrekdatumobj = document.getElementById("vertrekdatum");
    var aantaldagen = document.getElementById("aantaldagen").value;
    
    var parts = aankomstdatumobj.value.split('-');

    var maxDagen = get_maxdagen(parts[2], parts[1]);
    var dag=strip_nul(parts[0]);
    var maand=strip_nul(parts[1]);
    var jaar=strip_nul(parts[2]);


    var dagnummer = parseInt(dag) + parseInt(obj.value)
    var vertrekdatum = new Date()
    
    vertrekdatum.setMonth(maand-1)
    vertrekdatum.setFullYear(jaar)
    vertrekdatum.setDate(dag + parseInt(aantaldagen)); 
                

    vertrekdatumobj.value = vertrekdatum.getDate() + "-" + (vertrekdatum.getMonth() +1) + "-" + vertrekdatum.getFullYear()

    o(id);
    o("vertrekdatum");
    formobj[id]=true;
    return 2;
}


Maar nu telt ie het nog raarder op:
http://tigermedia.nl/test/cal/cal.php

Terwijl ik alles gewoon hetzelfde heb als jouw code, voor zover ik zie.

Huub Huub Barbatruc!


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:51

crisp

Devver

Pixelated

Informatie uit formvelden zal je eerst expliciet moeten omzetten naar integers...

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • DNA_Saint
  • Registratie: Maart 2004
  • Laatst online: 21-09 19:24

DNA_Saint

Go Go Gadget Ondertitel!

Topicstarter
Dat is gefixed, was een domme fout.
Nu telt hij nog steeds bij de 30 dagen maanden 1 maand extra erbij op.
Ik snap nog steeds niet waarom hij dit doet.
Ook al haal ik mijn eigen functie weg (get_maxdagen), dan telt hij nog steeds 1 maand erbij op.

Huub Huub Barbatruc!


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Even snelle reactie. Het is ook van belang te kijken naar de volgorde van:
JavaScript:
1
2
3
    vertrekdatum.setMonth(maand-1)
    vertrekdatum.setFullYear(jaar)
    vertrekdatum.setDate(dag + parseInt(aantaldagen));  


Weet zo snel even de juiste niet, maar als je dit als startdatum hebt: 30 januari 2009
En je doet setMonth(1) (februari), dan denkt ie, hey 30 februari ken ik niet, dat wordt 2 maart (28 feb + 2 = 30)

edit:
Sterker nog: new Date() pakt de huidige datum, vandaag is 31. Dus als je dan eerst setMonth doet naar een maand die 30 dagen heeft, gaat ie naar de volgende maand, dus slaat ie een maand over. Morgen zou je deze fouten niet meer hebben, alleen op alle 31ste van de maand :)

edit2:
met maxDagen doet ie verder niets, dus dat is niet van belang (lijkt mij)

[ Voor 31% gewijzigd door Guillome op 31-03-2009 16:56 ]

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Guillome schreef op dinsdag 31 maart 2009 @ 16:49:
Even snelle reactie. Het is ook van belang te kijken naar de volgorde van:
JavaScript:
1
2
3
    vertrekdatum.setMonth(maand-1)
    vertrekdatum.setFullYear(jaar)
    vertrekdatum.setDate(dag + parseInt(aantaldagen));  


Weet zo snel even de juiste niet, maar als je dit als startdatum hebt: 30 januari 2009
En je doet setMonth(1) (februari), dan denkt ie, hey 30 februari ken ik niet, dat wordt 2 maart (28 feb + 2 = 30)

edit:
Sterker nog: new Date() pakt de huidige datum, vandaag is 31. Dus als je dan eerst setMonth doet naar een maand die 30 dagen heeft, gaat ie naar de volgende maand, dus slaat ie een maand over. Morgen zou je deze fouten niet meer hebben, alleen op alle 31ste van de maand :)
Oftewel: de setFullYear method met 3 parameters gebruiken in plaats van 3 afzonderlijke aanroepen.

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • DNA_Saint
  • Registratie: Maart 2004
  • Laatst online: 21-09 19:24

DNA_Saint

Go Go Gadget Ondertitel!

Topicstarter
Huh, je hebt gelijk. Ik heb net even de tijd naar voren gezet en dan werkt alles wel.

*edit*
volgens mij werkt alles nu...
nog even alles grondig testen.
Maar alvast bedankt. Ik ben hier nu al volgens mij 4 uur lang mee bezig geweest.

----
natuurlijk even de werkende versie laten zien, na het harde werken :)

http://tigermedia.nl/klanten/mantravel/hotelboeking/

[ Voor 96% gewijzigd door DNA_Saint op 31-03-2009 17:21 ]

Huub Huub Barbatruc!


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 22-09 09:45

Onbekend

...

Het ziet er goed uit.

Nog 1 klein puntje :) :
Afbeeldingslocatie: http://i40.tinypic.com/10ykqyu.png

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

Verwijderd

Hij is sowieso niet echt full-prove

Bij 'Hotels' is het menu uitklapbaar en komen alle namen tevoorschijn, als je er op een klikt krijg je een javascript pop-up foutmelding 'Error: object wordt verwacht' URL: http://tigermedia/klanten/mantravel/hotelboeking/'

Ondanks dat verschijnt wel hetgeen ik heb ingevuld in het vakje.

Als ik bij Vakantieplaats iets kies staat er achter het vakje voor aantal kamers 'null'

Ohw en je moet echt de volgorde aanhouden, want als ik eerst het 'Aantal dagen' invul ipv Datum van Vertrekken krijg ik ook al weer een pop-up met een error`

En bij Kamer staat er '2 kamer bungalow (max 3 pers) (max 3 personen) ?

[ Voor 21% gewijzigd door Verwijderd op 31-03-2009 18:01 ]


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Verwijderd schreef op dinsdag 31 maart 2009 @ 17:58:
Hij is sowieso niet echt full-prove
'Full-prove'? Je bedoelt waarschijnlijk 'fool-proof' (onbenul-bestendig).

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • DNA_Saint
  • Registratie: Maart 2004
  • Laatst online: 21-09 19:24

DNA_Saint

Go Go Gadget Ondertitel!

Topicstarter
ja, zitten nog kleine foutjes in. Maar het grootste deel van het systeem werkt :p

Huub Huub Barbatruc!

Pagina: 1