Bereken tijd tussen 2 datums Javascript

Status
Niet open voor verdere reacties.

Donamd

Gebruiker
Lid geworden
16 feb 2010
Berichten
25
Hoe komt het dat als ik met onderstaande functie een datum probeer samen te stellen dat ik een verschil krijg in GMT

Code:
function makeDate (date) {
  var jaar = date.substring(0, 4);
  var maand = date.substring(4, 6);
  var dag = date.substring(6,8);
  var resultaat = new Date(maand + "/" + dag + "/" + jaar);
  
  return resultaat;  
}

dag1 : 20220711 -> resultaat = Mon Jul 11 2022 00:00:00 GMT+0200 (Midden-Europese zomertijd)
dag2 : 20231209 -> resultaat = Sat Dec 09 2023 00:00:00 GMT+0100 (Midden-Europese standaardtijd)

De eindbedoeling is dat ik het aantal dagen moet bekomen tussen dag2 & dag1 als volgt :

Code:
var diffTime = new Date(dag2 - dag1);
var diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));

Dit zou 517 dagen moeten zijn als ik mij niet vergis. Normaal zou ik hiermee een geheel getal moeten krijgen, maar doordat er een verschil met zomer & wintertijd zit en er gerekend wordt in seconden levert dit geen exact getal op.

Iemand een idee ?
 
Laatst bewerkt door een moderator:
In JS kan je substring, substr en slice gebruiken. Alle 3 kunnen een verschillend resultaat geven, daarvoor zal je de verschillen moeten nalezen. Daarbij komt dat substring en substr nog niet officieel in JS zijn opgenomen maar wél door alle browsers worden ondersteund.

Ikzelf gebruik altijd substr omdat die het meest logische resultaat geeft.
In de getallen heb je een bug zitten. Om je op weg te helpen....
Code:
function makeDate (date) {
  var jaar  = date.substr(0, 4);
  var maand = date.substr(4, 2);
  var dag   = date.substr(6, 2);
  // .....
}

Tip 1. Kijk eens bij getTime()
Tip 2. Controleer bij datumfuncties of de maand loopt van 1-12 of 0-11
 
Laatst bewerkt:
Ik heb de substring aangepast in de functie naar substr en heb het resultaat laten omzetten naar getTime()

Code:
function makeDate (date) {
  var jaar = date.substr(0, 4);
  var maand = date.substr(4, 2);
  var dag = date.substr(6, 2);
  var resultaat = new Date(maand + "/" + dag + "/" + jaar);
  var resultaat = resultaat.getTime();
  
  return resultaat;  
}

Dit geeft me volgende resultaat :

dag1 : 20220711 -> resultaat = 1657490400000
dag2 : 20231209 -> resultaat = 1702076400000

Als ik het verschil hier tussen neem bekom ik 44586000000.

Door deze verder te herleiden naar dagen
Code:
var days = (( dag2 - dag1 ) / (1000*60*60*24));
bekom ik 516.0416666666666, terwijl ik verwacht dat ik een geheel getal moet bekomen.

Ik vermoed dat uw opmerking om te controleren of bij datum functies of een maand loopt van 0 t/m 11 zal wellicht wel een deel van de oplossing zijn, maar hier ben ik niet in mee. Het lijkt mij toch onlogisch om een datum van 11 juli 2022 te moeten gaan noteren als 10/06/2022 :)
 
Top. Je bent bijna klaar!

JS gaat niet lekker om met floating point getallen, voorbeeld
Code:
console.log ( 0.1 + 0.2 );  // resultaat is 0.30000000000000004

// in jouw code heb je ook een floating point door de deling
var days = (( dag2 - dag1 ) / (1000*60*60*24));

Afronden op dagen gaat met floor() , daarmee rond je naar beneden af op een geheel getal.
Code:
// ....
resultaat = Math.floor(resultaat);
return resultaat;

Je kan in Excel controleren dat 516 het goede antwoord is.


aanvulling. als je zeker wilt weten dat het verschil goed berekend wordt.
Code:
var days = 0;
if (dag2 > dag1) {
    days = (( dag2 - dag1 ) / (1000*60*60*24));
} else {
    days = (( dag1 - dag2 ) / (1000*60*60*24));
}
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan