Maison > Questions et réponses > le corps du texte
P粉9680081752023-08-24 14:38:40
Au moment d'écrire ces lignes, une seule des autres réponses gère correctement la conversion DST (Daylight Savings Time). Voici les résultats sur un système situé en Californie :
1/1/2013- 3/10/2013- 11/3/2013- User Formula 2/1/2013 3/11/2013 11/4/2013 Result --------- --------------------------- -------- --------- --------- --------- Miles (d2 - d1) / N 31 0.9583333 1.0416666 Incorrect some Math.floor((d2 - d1) / N) 31 0 1 Incorrect fuentesjr Math.round((d2 - d1) / N) 31 1 1 Correct toloco Math.ceiling((d2 - d1) / N) 31 1 2 Incorrect N = 86400000
Bien que Math.round
renvoie le résultat correct, je pense que c'est un peu maladroit. Au lieu de cela, en tenant compte explicitement du changement de décalage UTC lorsque l'heure d'été commence ou se termine, nous pouvons utiliser une arithmétique précise :
function treatAsUTC(date) { var result = new Date(date); result.setMinutes(result.getMinutes() - result.getTimezoneOffset()); return result; } function daysBetween(startDate, endDate) { var millisecondsPerDay = 24 * 60 * 60 * 1000; return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay; } alert(daysBetween($('#first').val(), $('#second').val()));
Les calculs de date JavaScript sont délicats car les objets Date
stockent l'heure UTC en interne, pas l'heure locale. Par exemple, le 10/03/2013 à 00h00, heure standard du Pacifique (UTC-08:00) est stocké sous la forme 10/03/2013 à 8h00 UTC et 11/03/2013 à 00h00, heure avancée du Pacifique ( UTC-07 :00) stocké le 11/03/2013 à 7h00 UTC. Ce jour-là, l'heure locale de minuit à minuit n'a que 23 heures d'avance sur UTC !
Alors qu'une journée en heure locale peut durer plus ou moins de 24 heures, une journée en UTC dure toujours exactement 24 heures. 1 Le daysBetween
方法利用了这一点通过首先调用 treatAsUTC
ci-dessus ajuste les deux heures locales à minuit UTC, puis effectue la soustraction et la division pour comprendre ce fait.
1. JavaScript ignore les secondes intercalaires.
P粉1868974652023-08-24 12:44:32
Voici une implémentation datediff
rapide et sale de comme preuve de concept pour résoudre le problème posé dans la question. Cela repose sur le fait que vous pouvez obtenir le nombre de millisecondes écoulées entre deux dates en les soustrayant, ce qui les contraint à leurs valeurs numériques d'origine (nombre de millisecondes depuis début 1970).
/** * Take the difference between the dates and divide by milliseconds per day. * Round to nearest whole number to deal with DST. */ function datediff(first, second) { return Math.round((second - first) / (1000 * 60 * 60 * 24)); } /** * new Date("dateString") is browser-dependent and discouraged, so we'll write * a simple parse function for U.S. date format (which does no error checking) */ function parseDate(str) { var mdy = str.split('/'); return new Date(mdy[2], mdy[0] - 1, mdy[1]); } alert(datediff(parseDate(first.value), parseDate(second.value)));
<input id="first" value="1/1/2000"/> <input id="second" value="1/1/2001"/>