Cum fac rost de numărul de zile între două date în JavaScript? De exemplu, având două întâlniri în cutii de intrare:
<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>
<script>
alert(datediff("day", first, second)); // what goes here?
</script>
Aici este un rapid și murdar punerea în aplicare a datediff
, ca o dovada a conceptului pentru a rezolva problema așa cum este prezentat în întrebare. Ea se bazează pe faptul că puteți obține trecut de milisecunde între două date prin scăderea ei, care determină în primitive număr valoare (milisecunde de la începutul anului 1970).
// 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]);
}
function datediff(first, second) {
// Take the difference between the dates and divide by milliseconds per day.
// Round to nearest whole number to deal with DST.
return Math.round((second-first)/(1000*60*60*24));
}
alert(datediff(parseDate(first.value), parseDate(second.value)));
<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>
Ar trebui să fie conștienți de faptul că "normale" Data APIs (fără "UTC" în numele) operează în zona de fus orar local al utilizatorului's browser, astfel încât, în general, ai putea rula în probleme dacă utilizatorul este în zona de fus orar pe care nu't aștepta, și codul tău va avea de-a face cu lumina Zilei de Economisire de Timp tranziții. Ar trebui să citiți cu atenție documentația pentru Data de obiectul și metodele sale, și pentru ceva mai complicat, ia în considerare puternic, folosind o bibliotecă care oferă mai mult în condiții de siguranță și puternic de Api-uri pentru data de manipulare.
de Asemenea, pentru ilustrare, fragmentul utilizează numele accesul pe "fereastra" obiect pentru concizia, dar în producție, ar trebui să utilizați standardizate APIs ca getElementById, sau mai probabil, un cadru UI.
Ca din acest scris, doar una din celelalte răspunsuri se ocupă în mod corect DST (daylight saving time) tranziții. Aici sunt rezultatele pe un sistem cu sediul în California:
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
Deși Matematica.rotund` returnează rezultate corecte, cred că's oarecum greoaie. În schimb, în mod explicit de către contabilitate pentru ca modificările să UTC offset atunci când DST începe sau se termină, putem folosi exact aritmetică:
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()));
JavaScript data calculele sunt complicate pentru că "Data" obiecte magazin ori pe plan intern în UTC, nu ora locală. De exemplu, 3/10/2013 12:00 AM Pacific Standard Time (UTC-08:00) este stocată ca 3/10/2013 8:00 AM UTC, și 3/11/2013 12:00 pm Pacific Daylight Time (UTC-07:00) este stocată ca 3/11/2013 7:00 AM UTC. În această zi, de la miezul nopții la miezul nopții, ora locală este numai 23 de ore la UTC!
Deși cu o zi în ora locală poate fi mai mult sau mai puțin de 24 de ore, o zi în UTC este întotdeauna exact 24 de ore.1 daysBetween
metoda prezentata mai sus profită de acest fapt de către prima convocare `treatAsUTC să se adapteze atât la nivel local ori la miezul nopții UTC, înainte de scăderea și împărțirea.
1. JavaScript ignoră salt de secunde.
Cel mai simplu mod de a obține diferența dintre două date:
var diff = Math.floor(( Date.parse(str2) - Date.parse(str1) ) / 86400000);
Veți obține diferența de zile (sau NaN dacă una sau ambele nu ar putea fi analizat). Analiza data daruita rezultatul în milisecunde și pentru a obține de zi trebuie să împărțite prin 24 60 60 * 1000
Dacă vrei impartit pe zile, ore, minute, secunde și milisecunde:
function dateDiff( str1, str2 ) {
var diff = Date.parse( str2 ) - Date.parse( str1 );
return isNaN( diff ) ? NaN : {
diff : diff,
ms : Math.floor( diff % 1000 ),
s : Math.floor( diff / 1000 % 60 ),
m : Math.floor( diff / 60000 % 60 ),
h : Math.floor( diff / 3600000 % 24 ),
d : Math.floor( diff / 86400000 )
};
}
Aici este meu refactored versiune de James version:
function mydiff(date1,date2,interval) {
var second=1000, minute=second*60, hour=minute*60, day=hour*24, week=day*7;
date1 = new Date(date1);
date2 = new Date(date2);
var timediff = date2 - date1;
if (isNaN(timediff)) return NaN;
switch (interval) {
case "years": return date2.getFullYear() - date1.getFullYear();
case "months": return (
( date2.getFullYear() * 12 + date2.getMonth() )
-
( date1.getFullYear() * 12 + date1.getMonth() )
);
case "weeks" : return Math.floor(timediff / week);
case "days" : return Math.floor(timediff / day);
case "hours" : return Math.floor(timediff / hour);
case "minutes": return Math.floor(timediff / minute);
case "seconds": return Math.floor(timediff / second);
default: return undefined;
}
}
Vă recomandăm utilizarea moment.js biblioteca (http://momentjs.com/docs/#/displaying/difference/). Se ocupa ora de vară în mod corect și, în general, este mare de a lucra cu.
Exemplu:
var start = moment("2013-11-03");
var end = moment("2013-11-04");
end.diff(start, "days")
1
Aș merge mai departe și luați acest mic utilitar și în ea veți găsi funcții de asta pentru tine. Aici's un scurt exemplu:
<script type="text/javascript" src="date.js"></script>
<script type="text/javascript">
var minutes = 1000*60;
var hours = minutes*60;
var days = hours*24;
var foo_date1 = getDateFromFormat("02/10/2009", "M/d/y");
var foo_date2 = getDateFromFormat("02/12/2009", "M/d/y");
var diff_date = Math.round((foo_date2 - foo_date1)/days);
alert("Diff date is: " + diff_date );
</script>
const startDate = '2017-11-08';
const endDate = '2017-10-01';
const timeDiff = (new Date(startDate)) - (new Date(endDate));
const days = timeDiff / (1000 * 60 * 60 * 24)
Update: Știu că acest lucru nu este o parte din întrebările dumneavoastră, dar, în general, nu aș recomanda de a face orice calcul data sau de manipulare în vanilie JavaScript și folosi mai degrabă o bibliotecă, cum ar fi data-fns sau moment.js pentru că din cauza mai multor cazuri de margine.
Folosind Moment.js
var future = moment('05/02/2015');
var start = moment('04/23/2015');
var d = future.diff(start, 'days'); // 9
console.log(d);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>
Valorile de dată în JS sunt datetime valori.
Deci, data directe calcule sunt inconsistente:
(2013-11-05 00:00:00) - (2013-11-04 10:10:10) < 1 day
de exemplu, avem nevoie pentru a converti de a 2-a data:
(2013-11-05 00:00:00) - (2013-11-04 00:00:00) = 1 day
metoda ar putea fi trunchia mills în ambele date:
var date1 = new Date('2013/11/04 00:00:00');
var date2 = new Date('2013/11/04 10:10:10'); //less than 1
var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);
date2 = new Date('2013/11/05 00:00:00'); //1
var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);
Pentru a Calcula zile între 2 dat de dvs puteți folosi următorul cod.Datele folosesc aici sunt Jan 01 2016 și 31 Decembrie 2016
var day_start = new Date("Jan 01 2016");
var day_end = new Date("Dec 31 2016");
var total_days = (day_end - day_start) / (1000 * 60 * 60 * 24);
document.getElementById("demo").innerHTML = Math.round(total_days);
<h3>DAYS BETWEEN GIVEN DATES</h3>
<p id="demo"></p>
Este posibil să se calculeze o dovadă completă zile diferența dintre două date de odihnă în diferite TZs folosind următoarea formulă:
var start = new Date('10/3/2015');
var end = new Date('11/2/2015');
var days = (end - start) / 1000 / 60 / 60 / 24;
console.log(days);
// actually its 30 ; but due to daylight savings will show 31.0xxx
// which you need to offset as below
days = days - (end.getTimezoneOffset() - start.getTimezoneOffset()) / (60 * 24);
console.log(days);
Mai bine pentru a scăpa de DST, Matematica.ceil, Matematica.podea etc. prin utilizarea UTC ori:
var firstDate = Date.UTC(2015,01,2);
var secondDate = Date.UTC(2015,04,22);
var diff = Math.abs((firstDate.valueOf()
- secondDate.valueOf())/(24*60*60*1000));
Acest exemplu oferă o diferență 109 zile. 24*60*60*1000
este o zi în milisecunde.
Am găsit această întrebare atunci când vreau să fac unele calcula pe doua data, dar de data avea de ore și de minute de valoare, am modificat @michael-liu 's a răspunde pentru a se potrivi cerința mea, și a trecut testul.
dif zile 2012-12-31 23:00 " și " 2013-01-01 01:00ar trebui să fie egală cu 1. (2 ore) dif zile 2012-12-31 01:00 " și " 2013-01-01 23:00
ar trebui să fie egală cu 1. (46 de ore)
function treatAsUTC(date) {
var result = new Date(date);
result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
return result;
}
var millisecondsPerDay = 24 * 60 * 60 * 1000;
function diffDays(startDate, endDate) {
return Math.floor(treatAsUTC(endDate) / millisecondsPerDay) - Math.floor(treatAsUTC(startDate) / millisecondsPerDay);
}
Cred că soluțiile sunt't corecta 100% mi-ar folosi ceil în loc de podea, runda va funcționa, dar nu't dreptul de funcționare.
function dateDiff(str1, str2){
var diff = Date.parse(str2) - Date.parse(str1);
return isNaN(diff) ? NaN : {
diff: diff,
ms: Math.ceil(diff % 1000),
s: Math.ceil(diff / 1000 % 60),
m: Math.ceil(diff / 60000 % 60),
h: Math.ceil(diff / 3600000 % 24),
d: Math.ceil(diff / 86400000)
};
}
Ce despre utilizarea formatDate de DatePicker widget? Ai putea folosi pentru a converti datele în timestamp format (milisecunde din 01/01/1970) și apoi face o simplă scădere.
function timeDifference(date1, date2) {
var oneDay = 24 * 60 * 60; // hours*minutes*seconds
var oneHour = 60 * 60; // minutes*seconds
var oneMinute = 60; // 60 seconds
var firstDate = date1.getTime(); // convert to milliseconds
var secondDate = date2.getTime(); // convert to milliseconds
var seconds = Math.round(Math.abs(firstDate - secondDate) / 1000); //calculate the diffrence in seconds
// the difference object
var difference = {
"days": 0,
"hours": 0,
"minutes": 0,
"seconds": 0,
}
//calculate all the days and substract it from the total
while (seconds >= oneDay) {
difference.days++;
seconds -= oneDay;
}
//calculate all the remaining hours then substract it from the total
while (seconds >= oneHour) {
difference.hours++;
seconds -= oneHour;
}
//calculate all the remaining minutes then substract it from the total
while (seconds >= oneMinute) {
difference.minutes++;
seconds -= oneMinute;
}
//the remaining seconds :
difference.seconds = seconds;
//return the difference object
return difference;
}
console.log(timeDifference(new Date(2017,0,1,0,0,0),new Date()));
Acest lucru nu poate fi cea mai eleganta solutie, dar se pare că pentru a răspunde la întrebare cu o relativ simplu bit de cod, cred. Poate't ai folosi ceva de genul asta:
function dayDiff(startdate, enddate) {
var dayCount = 0;
while(enddate >= startdate) {
dayCount++;
startdate.setDate(startdate.getDate() + 1);
}
return dayCount;
}
Acest lucru este presupunând că se trece data obiecte ca parametri.
Fiți atenți atunci când utilizarea milisecunde.
La data.getTime() se întoarce milisecunde și de a face operație matematică cu milisecunde necesită să includă
Exemplu de comentariu de mai sus este cea mai bună soluție am găsit până acum https://stackoverflow.com/a/11252167/2091095 . Dar utilizarea +1 pentru rezultatul său, dacă doriți să conta toate zilele implicate.
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;
}
var diff = daysBetween($('#first').val(), $('#second').val()) + 1;
Date.prototype.days = function(to) {
return Math.abs(Math.floor(to.getTime() / (3600 * 24 * 1000)) - Math.floor(this.getTime() / (3600 * 24 * 1000)))
}
console.log(new Date('2014/05/20').days(new Date('2014/05/23'))); // 3 days
console.log(new Date('2014/05/23').days(new Date('2014/05/20'))); // 3 days
Am avut aceeași problemă în Unghiulare. Am făcut o copie pentru că altfel el va suprascrie prima data. Ambele date trebuie să aibă timp 00:00:00 (evident)
/*
* Deze functie gebruiken we om het aantal dagen te bereken van een booking.
* */
$scope.berekenDagen = function ()
{
$scope.booking.aantalDagen=0;
/*De loper is gelijk aan de startdag van je reservatie.
* De copy is nodig anders overschijft angular de booking.van.
* */
var loper = angular.copy($scope.booking.van);
/*Zolang de reservatie beschikbaar is, doorloop de weekdagen van je start tot einddatum.*/
while (loper < $scope.booking.tot) {
/*Tel een dag op bij je loper.*/
loper.setDate(loper.getDate() + 1);
$scope.booking.aantalDagen++;
}
/*Start datum telt natuurlijk ook mee*/
$scope.booking.aantalDagen++;
$scope.infomsg +=" aantal dagen: "+$scope.booking.aantalDagen;
};