Làm cách nào để tôi có được số ngày giữa hai ngày trong JavaScript?


403

Làm cách nào để tôi có được số ngày giữa hai ngày trong JavaScript? Ví dụ: đã cho hai ngày trong hộp đầu vào:

<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

<script>
  alert(datediff("day", first, second)); // what goes here?
</script>

5
99% trường hợp người dùng yêu cầu "số ngày giữa hai ngày" điều cô ấy không hiểu là cô ấy đang cố so sánh táo với lê. Vấn đề trở nên đơn giản nếu được hỏi "Có bao nhiêu NGÀY trong ĐỔI NGÀY?", Hoặc có bao nhiêu hình vuông tôi phải vượt qua trên lịch. Điều này làm mất đi các vấn đề tiết kiệm thời gian và ánh sáng ban ngày, v.v ... Sự nhầm lẫn được ngụ ý đối với chúng tôi do cấu trúc dữ liệu datetime hoàn toàn vô nghĩa. Không có thứ gọi là datetime có ngày và có thời gian, hai đối tượng rất khác biệt về cả bản chất và hành vi
Mihail Shishkov

Đối với một hàm phân chia sự khác biệt thành (toàn bộ) đơn vị thời gian, hãy sử dụng câu trả lời tại stackoverflow.com/a/53092438/3787376 .
Edward

Tôi cảm thấy câu hỏi này nên được xóa hoặc ít nhất là đánh dấu "tránh" vì hầu hết các câu trả lời đều không chính xác hoặc phụ thuộc vào các thư viện khác nhau.
RobG

Câu trả lời:


409

Dưới đây là một triển khai nhanh chóng và bẩn thỉudatediff , như một bằng chứng về khái niệm để giải quyết vấn đề như được trình bày trong câu hỏi. Nó dựa vào thực tế là bạn có thể có được một phần nghìn giây trôi qua giữa hai ngày bằng cách trừ chúng, điều này buộc chúng vào giá trị số nguyên thủy của chúng (mili giây kể từ đầu năm 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"/>

Bạn nên lưu ý rằng API ngày "bình thường" (không có "UTC" trong tên) hoạt động theo múi giờ địa phương của trình duyệt của người dùng, do đó, nói chung bạn có thể gặp sự cố nếu người dùng của bạn ở múi giờ mà bạn không mong đợi và mã của bạn sẽ phải xử lý các chuyển đổi Thời gian tiết kiệm ánh sáng ban ngày. Bạn nên đọc kỹ tài liệu cho đối tượng Date và các phương thức của nó, và đối với bất kỳ điều gì phức tạp hơn, hãy cân nhắc mạnh mẽ việc sử dụng thư viện cung cấp API an toàn và mạnh mẽ hơn để thao tác ngày.

Ngoài ra, với mục đích minh họa, đoạn mã sử dụng quyền truy cập được đặt tên trên windowđối tượng để đơn giản, nhưng trong sản xuất, bạn nên sử dụng các API được tiêu chuẩn hóa như getEuityById , hoặc nhiều khả năng, một số khung UI.


2
Tôi nghĩ Math.trunc () phù hợp hơn. Chỉ trong trường hợp ai đó sử dụng các đối tượng Ngày chính xác hơn (bao gồm cả giờ, phút và giây)
Jin Wang

21
Vì câu trả lời được đánh dấu là chính xác và được bình chọn cao nhất (tính đến thời điểm hiện tại), đáng để nhận xét rằng câu trả lời này không xử lý chính xác Giờ tiết kiệm ánh sáng ban ngày. Thay vào đó, hãy xem câu trả lời của Michael Liu.
osullic

ParseDate làm gì chính xác?
Mohammad Kermani

2
@ osullic, câu trả lời này xử lý việc tiết kiệm ánh sáng ban ngày với Math.round , tuy nhiên, nó dự kiến ​​sẽ chỉ là chuỗi ngày, không phải ngày và giờ.
RobG

2
Chỉ cần nhớ rằng ngày ở định dạng Hoa Kỳ trong ví dụ này, tức là MM / DD / YYYY. Nếu bạn cần phiên bản Vương quốc Anh, thì bạn cần thay đổi parseDatephương thức thành:return new Date(mdy[2], mdy[1], mdy[0]-1);
Viqas

207

Theo văn bản này, chỉ có một trong những câu trả lời khác xử lý chính xác các chuyển tiếp DST (tiết kiệm thời gian ban ngày). Dưới đây là kết quả trên một hệ thống ở 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

Mặc dù Math.roundtrả về kết quả chính xác, tôi nghĩ rằng nó hơi khó hiểu. Thay vào đó, bằng cách hạch toán rõ ràng các thay đổi đối với phần bù UTC khi DST bắt đầu hoặc kết thúc, chúng ta có thể sử dụng số học chính xác:

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()));

Giải trình

Tính toán ngày JavaScript rất khó vì Date các đối tượng lưu trữ thời gian nội bộ trong UTC, không phải giờ địa phương. Ví dụ: 3/10/2013 12:00 AM Giờ chuẩn Thái Bình Dương (UTC-08: 00) được lưu trữ là 3/10/2013 8:00 AM UTC và 3/11/2013 12:00 AM Giờ ban ngày Thái Bình Dương ( UTC-07: 00) được lưu trữ vào ngày 3/11/2013 7:00 AM UTC. Vào ngày này, nửa đêm đến nửa đêm giờ địa phương chỉ 23 giờ trong UTC!

Mặc dù một ngày theo giờ địa phương có thể có nhiều hơn hoặc ít hơn 24 giờ, một ngày ở UTC luôn chính xác là 24 giờ. 1 Các daysBetweenphương pháp thể hiện trên lợi dụng thực tế này bằng cách gọi điện thoại đầu tiên treatAsUTCđể điều chỉnh cả hai lần địa phương đến nửa đêm UTC, trước khi trừ và chia.

1. JavaScript bỏ qua giây nhuận.


2
Không cần sử dụng UTC, thật tốt khi chỉ đặt giờ địa phương thành nửa đêm (hoặc cùng một giá trị cho cả hai ngày). Ngày phân số được giới thiệu bằng cách tiết kiệm ánh sáng ban ngày chỉ là ± 0,04 (và ở một số nơi ít hơn), do đó, nó làm tròn với Math.round . ;-) Dựa vào hàm tạo ngày để phân tích chuỗi không phải là ý kiến ​​hay. Nếu bạn thực sự muốn sử dụng các giá trị UTC, hãy phân tích các chuỗi sử dụng Date.UTC(...)ở vị trí đầu tiên.
RobG

2
@RobG: Như tôi đã nói trong câu trả lời của mình: "Mặc dù Math.round trả về kết quả chính xác, tôi nghĩ nó hơi khó hiểu. Thay vào đó, bằng cách hạch toán rõ ràng các thay đổi đối với phần bù UTC khi DST bắt đầu hoặc kết thúc, chúng ta có thể sử dụng số học chính xác."
Michael Liu

Trên thực tế, những lần bạn đại diện là "không chính xác", về mặt kỹ thuật, chính xác. Bạn không thay đổi DateTimes thành UTC ... bạn chỉ cần thay đổi thời gian của mỗi DateTime để lấy số nguyên. Làm tròn không phải là "cục mịch" ... đó chính xác là cách tiếp cận chính xác ở đây bởi vì đó là những gì bạn đang làm trong đầu: dù sao bạn cũng làm tròn phần thời gian (giờ, phút, giây) và chỉ cố gắng để có được toàn bộ số ngày.
JDB vẫn còn nhớ Monica

116

Cách dễ nhất để có được sự khác biệt giữa hai ngày:

var diff =  Math.floor(( Date.parse(str2) - Date.parse(str1) ) / 86400000); 

Bạn nhận được các ngày khác nhau (hoặc NaN nếu không thể phân tích cú pháp một hoặc cả hai). Ngày phân tích đã cho kết quả tính bằng mili giây và để có được kết quả theo ngày, bạn phải chia nó cho 24 * 60 * 60 * 1000

Nếu bạn muốn nó chia cho ngày, giờ, phút, giây và mili giây:

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        )
    };
}

Đây là phiên bản James được tái cấu trúc của tôi:

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;
    }
}

2
Câu trả lời không hay. Math.floor () sẽ mất bạn một ngày khi đồng hồ chuyển tiếp để tiết kiệm ánh sáng ban ngày. Math.round () sẽ đưa ra câu trả lời đúng trong hầu hết các tình huống nhưng cũng có những lựa chọn tốt hơn trong câu trả lời khác.
Phil B

101

Tôi khuyên bạn nên sử dụng thư viện Moment.js ( http://momentjs.com/docs/#/displaying/difference/ ). Nó xử lý thời gian tiết kiệm ánh sáng ban ngày một cách chính xác và nói chung là tuyệt vời để làm việc với.

Thí dụ:

var start = moment("2013-11-03");
var end = moment("2013-11-04");
end.diff(start, "days")
1

10
Giống như một lời cảnh báo trong khi khoảnh khắc là tuyệt vời, nó là một sự phụ thuộc khá lớn
Jason Axelson

Nó thực sự nên end.diff(start,"days")mặc dù mã như được viết sẽ hoạt động vì ngày bắt đầu là sau ngày kết thúc!
gordon613

40

Tôi sẽ tiếp tục và lấy tiện ích nhỏ này và trong đó bạn sẽ tìm thấy các chức năng này cho bạn. Đây là một ví dụ ngắn:

        <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>

28
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)
  1. Đặt ngày bắt đầu
  2. Đặt ngày kết thúc
  3. Tính chênh lệch
  4. Chuyển đổi mili giây thành ngày

Cập nhật: Tôi biết đây không phải là một phần câu hỏi của bạn nhưng nói chung tôi không khuyên bạn nên thực hiện bất kỳ phép tính ngày hoặc thao tác nào trong vanilla JavaScript và sử dụng một thư viện như date-fns hoặc khoảnh khắc cho nó do nhiều trường hợp cạnh.


5
Tôi đánh giá cao câu trả lời như thế này: ngắn, đơn giản và không cần phụ thuộc ngẫu nhiên! Chúc mừng.
daCoda

2
Có phải chỉ có tôi đã timeDifftrở lại trong tiêu cực? Không nên timeDiff(new Date(endDate)) - (new Date(startDate));?
Feyisayo Sonubi

@ feyisayo-sonubi tùy thuộc vào thứ tự bạn vượt qua trong ngày bắt đầu và ngày kết thúc. Trong ví dụ này(new Date('2017-11-08')) - (new Date('2017-10-01')) // 3283200000
marcobiedermann

const timeDiff = +(new Date(start)) - +(new Date(end));
Ben Racicot

Tuyệt quá. Mặc dù tôi thíchreturn (Date.UTC(yr2, mo2-1, dy2) - Date.UTC(yr1, mo1-1, dy1)) / 86400000;
dcromley

13

Sử dụng 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>


Moment.js thực sự tiện dụng cho những thứ như YTD diff được tính var now = moment(), yearStart = moment().startOf('year'); var ytdDays = now.diff(yearStart, 'days'); // this can be years, months, weeks, days, hours, minutes, and seconds console.log(ytdDays); nhiều hơn ở đây: Momentjs.com
Sharif

11

Giá trị ngày trong JS là giá trị datetime.

Vì vậy, tính toán ngày trực tiếp không nhất quán:

(2013-11-05 00:00:00) - (2013-11-04 10:10:10) < 1 day

ví dụ: chúng ta cần chuyển đổi ngày thứ 2:

(2013-11-05 00:00:00) - (2013-11-04 00:00:00) = 1 day

phương pháp có thể cắt ngắn các nhà máy trong cả hai ngày:

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);


9

Tốt hơn là loại bỏ DST, Math.ceil, Math.floor, v.v. bằng cách sử dụng lần UTC:

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));

Ví dụ này cho chênh lệch 109 ngày. 24*60*60*1000là một ngày tính bằng mili giây.


9

Để tính ngày giữa 2 ngày nhất định, bạn có thể sử dụng mã sau đây. Ngày tôi sử dụng ở đây là ngày 1 tháng 1 năm 2016 và ngày 31 tháng 12 năm 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>


9

Có thể tính chênh lệch ngày chứng minh đầy đủ giữa hai ngày nghỉ giữa các TZ khác nhau bằng công thức sau:

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);


Đây là câu trả lời đúng nhất, bạn phải cân nhắc DST! Cảm ơn
Gisway

6

Tôi đã tìm thấy câu hỏi này khi tôi muốn thực hiện một số tính toán vào hai ngày, nhưng ngày có giá trị giờ và phút, tôi đã sửa đổi câu trả lời của @ michael-liu để phù hợp với yêu cầu của tôi và nó đã vượt qua bài kiểm tra của tôi.

ngày khác 2012-12-31 23:002013-01-01 01:00nên bằng 1. (2 giờ) ngày khác 2012-12-31 01:002013-01-01 23:00nên bằng 1. (46 giờ)

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);
}

6
var start= $("#firstDate").datepicker("getDate");
var end= $("#SecondDate").datepicker("getDate");
var days = (end- start) / (1000 * 60 * 60 * 24);
 alert(Math.round(days));

ví dụ jsfiddle :)


6

Tôi nghĩ rằng các giải pháp không đúng 100% tôi sẽ sử dụng trần thay vì sàn , vòng sẽ hoạt động nhưng đó không phải là hoạt động đúng.

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)
    };
}

4
Ngày có thể có hơn 24 giờ và phút có thể có hơn 60 giây. Sử dụng Math.ceil () sẽ vượt qua trong những trường hợp này.
Rich Dougherty

5

Còn việc sử dụng formatDate từ widget DatePicker thì sao? Bạn có thể sử dụng nó để chuyển đổi ngày ở định dạng dấu thời gian (mili giây kể từ ngày 01/01/1970) và sau đó thực hiện phép trừ đơn giản.


5

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()));


1
Tôi có thể yêu cầu bạn vui lòng thêm một số bối cảnh xung quanh câu trả lời của bạn. Câu trả lời chỉ có mã là khó hiểu. Nó sẽ giúp người hỏi và người đọc tương lai cả nếu bạn có thể thêm thông tin trong bài viết của mình.
RBT

Tôi muốn chỉnh sửa nhưng tôi đã gặp lỗi, tôi có thể gửi bản chỉnh sửa :(.
Noreddine Belhadj Cheikh

2
@ N.Belhadj bạn có thể thay thế tất cả những vòng lặp đó bằng các thao tác div và mod (%) đơn giản
Mihail Shishkov

4

Đây có thể không phải là giải pháp tao nhã nhất, nhưng nó dường như trả lời câu hỏi với một đoạn mã tương đối đơn giản, tôi nghĩ vậy. Bạn không thể sử dụng một cái gì đó như thế này:

function dayDiff(startdate, enddate) {
  var dayCount = 0;

  while(enddate >= startdate) {
    dayCount++;
    startdate.setDate(startdate.getDate() + 1);
  }

return dayCount; 
}

Điều này giả sử bạn đang truyền các đối tượng ngày làm tham số.


4

Nếu bạn có hai dấu thời gian unix, bạn có thể sử dụng chức năng này (tạo ra một chút dài dòng hơn cho rõ ràng):

// Calculate number of days between two unix timestamps
// ------------------------------------------------------------
var daysBetween = function(timeStampA, timeStampB) {
    var oneDay = 24 * 60 * 60 * 1000; // hours * minutes * seconds * milliseconds
    var firstDate = new Date(timeStampA * 1000);
    var secondDate = new Date(timeStampB * 1000);
    var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
    return diffDays;
};

Thí dụ:

daysBetween(1096580303, 1308713220); // 2455

4

Hãy cẩn thận khi sử dụng mili giây .

Các date.getTime () trả về mili giây và làm hoạt động toán học với mili giây đòi hỏi để bao gồm

  • Giờ tiết kiệm ánh sáng ban ngày (DST)
  • kiểm tra xem cả hai ngày có cùng thời gian không (giờ, phút, giây, mili giây)
  • đảm bảo hành vi nào của ngày diff là bắt buộc: 19 tháng 9 năm 2016 - 29 tháng 9 năm 2016 = chênh lệch 1 hoặc 2 ngày?

Ví dụ từ nhận xét ở trên là giải pháp tốt nhất tôi tìm thấy cho đến nay https://stackoverflow.com/a/11252167/2091095 . Nhưng sử dụng +1 cho kết quả của nó nếu bạn muốn tính tất cả các ngày liên quan.

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;

4

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


3

Tôi đã có cùng một vấn đề trong Angular. Tôi làm bản sao vì người khác sẽ ghi đè lên ngày đầu tiên. Cả hai ngày phải có thời gian 00:00:00 (rõ ràng)

 /*
* 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;
};

3

Tôi đã sử dụng mã dưới đây để thử nghiệm chức năng ngày đăng cho một bài đăng tin tức. Tôi tính phút hoặc giờ hoặc ngày hoặc năm dựa trên ngày đăng và ngày hiện tại.

var startDate= new Date("Mon Jan 01 2007 11:00:00");
var endDate  =new Date("Tue Jan 02 2007 12:50:00");
var timeStart = startDate.getTime();
var timeEnd = endDate.getTime();
var yearStart = startDate.getFullYear();
var yearEnd   = endDate.getFullYear();
if(yearStart == yearEnd)
 {
  var hourDiff = timeEnd - timeStart; 
  var secDiff = hourDiff / 1000;
  var minDiff = hourDiff / 60 / 1000; 
  var hDiff = hourDiff / 3600 / 1000; 
  var myObj = {};
  myObj.hours = Math.floor(hDiff);
  myObj.minutes = minDiff  
  if(myObj.hours >= 24)
   {
    console.log(Math.floor(myObj.hours/24) + "day(s) ago")
   } 
 else if(myObj.hours>0)
  {
   console.log(myObj.hours +"hour(s) ago")
  }
 else
  {
   console.log(Math.abs(myObj.minutes) +"minute(s) ago")
  }
}
else
{
var yearDiff = yearEnd - yearStart;
console.log( yearDiff +" year(s) ago");
}

Vui lòng giải thích mã của bạn và bạn đã giải quyết vấn đề, chỉ cần dán mã được coi là một câu trả lời xấu.
Marco Scabbiolo

2
Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Michael Parker

Cảm ơn @ MarcoScabbiolo, @ Michael Parker vì những bình luận. Vì vậy, tôi mới biết về Stackoverflow về mặt trả lời, tôi không biết làm thế nào để đưa ra giải pháp
Ramees Rahath

3

nếu bạn muốn có DateArray với ngày, hãy thử điều này:

<script>
        function getDates(startDate, stopDate) {
        var dateArray = new Array();
        var currentDate = moment(startDate);
        dateArray.push( moment(currentDate).format('L'));

        var stopDate = moment(stopDate);
        while (dateArray[dateArray.length -1] != stopDate._i) {
            dateArray.push( moment(currentDate).format('L'));
            currentDate = moment(currentDate).add(1, 'days');
        }
        return dateArray;
      }
</script>

Gỡ lỗi


3

Cách đơn giản để tính ngày giữa hai ngày là loại bỏ cả hai thành phần thời gian của chúng, tức là đặt giờ, phút, giây và mili giây thành 0 và sau đó trừ đi thời gian của chúng và lặn với giá trị mili giây của một ngày.

var firstDate= new Date(firstDate.setHours(0,0,0,0));
var secondDate= new Date(secondDate.setHours(0,0,0,0));
var timeDiff = firstDate.getTime() - secondDate.getTime();
var diffDays =timeDiff / (1000 * 3600 * 24);

vấn đề với giải pháp của bạn là, bạn đang giả sử FirstDate và secondDate là những ngày mà sau đó không cần phải thay đổi chúng thành ngày nữa và nếu chúng không phải là ngày * mà không phải) bạn sẽ gặp lỗi trên setHours. sửa lỗi này, bạn cần phải di chuyển ra khỏi setHoursnew Date
AAA

2
function formatDate(seconds, dictionary) {
    var foo = new Date;
    var unixtime_ms = foo.getTime();
    var unixtime = parseInt(unixtime_ms / 1000);
    var diff = unixtime - seconds;
    var display_date;
    if (diff <= 0) {
        display_date = dictionary.now;
    } else if (diff < 60) {
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.second;
        } else {
            display_date = diff + ' ' + dictionary.seconds;
        }
    } else if (diff < 3540) {
        diff = Math.round(diff / 60);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.minute;
        } else {
            display_date = diff + ' ' + dictionary.minutes;
        }
    } else if (diff < 82800) {
        diff = Math.round(diff / 3600);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.hour;
        } else {
            display_date = diff + ' ' + dictionary.hours;
        }
    } else {
        diff = Math.round(diff / 86400);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.day;
        } else {
            display_date = diff + ' ' + dictionary.days;
        }
    }
    return display_date;
}

2

Đơn giản dễ dàng và tinh tế. Chức năng này sẽ được gọi sau mỗi 1 giây để cập nhật thời gian.

const year = (new Date().getFullYear());
const bdayDate = new Date("04,11,2019").getTime();  //mmddyyyy

// countdown
let timer = setInterval(function() {

// get today's date
const today = new Date().getTime();

// get the difference
const diff = bdayDate - today;

// math
let days = Math.floor(diff / (1000 * 60 * 60 * 24));
let hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
let minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
let seconds = Math.floor((diff % (1000 * 60)) / 1000);

}, 1000);

1

Một giải pháp tốt hơn bởi

Bỏ qua phần thời gian

nó sẽ trả về 0 nếu cả hai ngày giống nhau.

function dayDiff(firstDate, secondDate) {
  firstDate = new Date(firstDate);
  secondDate = new Date(secondDate);
  if (!isNaN(firstDate) && !isNaN(secondDate)) {
    firstDate.setHours(0, 0, 0, 0); //ignore time part
    secondDate.setHours(0, 0, 0, 0); //ignore time part
    var dayDiff = secondDate - firstDate;
    dayDiff = dayDiff / 86400000; // divide by milisec in one day
    console.log(dayDiff);
  } else {
    console.log("Enter valid date.");
  }
}

$(document).ready(function() {
  $('input[type=datetime]').datepicker({
    dateFormat: "mm/dd/yy",
    changeMonth: true,
    changeYear: true
  });
  $("#button").click(function() {
    dayDiff($('#first').val(), $('#second').val());
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="//code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<input type="datetime" id="first" value="12/28/2016" />
<input type="datetime" id="second" value="12/28/2017" />
<input type="button" id="button" value="Calculate">


1

Một đóng góp, cho ngày trước 1970-01-01 và sau 2038-01-19

function DateDiff(aDate1, aDate2) {
  let dDay = 0;
  this.isBissexto = (aYear) => {
    return (aYear % 4 == 0 && aYear % 100 != 0) || (aYear % 400 == 0);
  };
  this.getDayOfYear = (aDate) => {
    let count = 0;
    for (let m = 0; m < aDate.getUTCMonth(); m++) {
      count += m == 1 ? this.isBissexto(aDate.getUTCFullYear()) ? 29 : 28 : /(3|5|8|10)/.test(m) ? 30 : 31;
    }
    count += aDate.getUTCDate();
    return count;
  };
  this.toDays = () => {
    return dDay;
  };
  (() => {
    let startDate = aDate1.getTime() <= aDate2.getTime() ? new Date(aDate1.toISOString()) : new Date(aDate2.toISOString());
    let endDate = aDate1.getTime() <= aDate2.getTime() ? new Date(aDate2.toISOString()) : new Date(aDate1.toISOString());
    while (startDate.getUTCFullYear() != endDate.getUTCFullYear()) {
      dDay += (this.isBissexto(startDate.getFullYear())? 366 : 365) - this.getDayOfYear(startDate) + 1;
      startDate = new Date(startDate.getUTCFullYear()+1, 0, 1);
    }
    dDay += this.getDayOfYear(endDate) - this.getDayOfYear(startDate);
  })();
}

0
   function validateDate() {
        // get dates from input fields
        var startDate = $("#startDate").val();
        var endDate = $("#endDate").val();
        var sdate = startDate.split("-");
        var edate = endDate.split("-");
        var diffd = (edate[2] - sdate[2]) + 1;
        var leap = [ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
        var nonleap = [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
        if (sdate[0] > edate[0]) {
            alert("Please enter End Date Year greater than Start Date Year");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else if (sdate[1] > edate[1]) {
            alert("Please enter End Date month greater than Start Date month");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else if (sdate[2] > edate[2]) {
            alert("Please enter End Date greater than Start Date");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else {
            if (sdate[0] / 4 == 0) {
                while (sdate[1] < edate[1]) {
                    diffd = diffd + leap[sdate[1]++];
                }
            } else {
                while (sdate[1] < edate[1]) {
                    diffd = diffd + nonleap[sdate[1]++];
                }
            }
            document.getElementById("numberOfDays").value = diffd;
        }
    }

0

Bạn có thể sử dụng UnderscoreJS để định dạng và tính toán sự khác biệt.

Bản giới thiệu https://jsfiddle.net/sumitridhal/8sv94msp/

 var startDate = moment("2016-08-29T23:35:01");
var endDate = moment("2016-08-30T23:35:01");  
  

console.log(startDate);
console.log(endDate);

var resultHours = endDate.diff(startDate, 'hours', true);

document.body.innerHTML = "";
document.body.appendChild(document.createTextNode(resultHours));
body { white-space: pre; font-family: monospace; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js"></script>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.