Cách tính số ngày giữa hai ngày


282

Tôi có hai ngày đầu vào lấy từ điều khiển Bộ chọn ngày. Tôi đã chọn ngày bắt đầu 2/2/2012 và ngày kết thúc 2/7/2012. Tôi đã viết mã sau đây cho điều đó.

Tôi sẽ nhận được kết quả là 6 nhưng tôi nhận được 5.

function SetDays(invoker) {   
    var start = $find('<%=StartWebDatePicker.ClientID%>').get_value();
    var end = $find('<%=EndWebDatePicker.ClientID%>').get_value();

    var oneDay=1000 * 60 * 60 * 24;
    var difference_ms = Math.abs(end.getTime() - start.getTime())
    var diffValue = Math.round(difference_ms / oneDay);
}

Bất cứ ai có thể cho tôi biết làm thế nào tôi có thể nhận được sự khác biệt chính xác?


Tại sao bạn nên nhận kết quả = 6 ??? 07 - 02 = 05 ngày ....
André Alçada Padez

1
Nhưng phạm vi ngày từ 2 đến 7 là 2,3,4,5,6,7 = 6 ngày.
Supr

Trong khi khác biệt, tôi cũng muốn xem xét Ngày bắt đầu ....
Vaibhav Deshmukh

17
Chà ... tại sao không chỉ thêm 1 vào câu trả lời?
Mũi nhọn

Vấn đề (nếu có vấn đề gì cả) là chức năng, không phải kỹ thuật. @Pointy bình luận là câu trả lời. Đó là lý do tại sao một số người hỏi tại sao chúng ta ở thế kỷ XXI.
Leandro

Câu trả lời:


666

http://momentjs.com/ hoặc https://date-fns.org/

Từ tài liệu Khoảnh khắc:

var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days')   // =1

hoặc bao gồm bắt đầu:

a.diff(b, 'days')+1   // =2

Nhịp đập lộn xộn với dấu thời gian và múi giờ theo cách thủ công.

Tùy thuộc vào trường hợp sử dụng cụ thể của bạn, bạn có thể

  1. Sử dụng a/b.startOf('day')và / hoặc a/b.endOf('day')để buộc diff phải bao gồm hoặc độc quyền ở "kết thúc" (như được đề xuất bởi @kotpal trong các bình luận).
  2. Đặt số thứ ba trueđể có được một diff dấu chấm động mà bạn có thể sau đó Math.floor, Math.ceilhoặc Math.roundkhi cần thiết.
  3. Tùy chọn 2 cũng có thể được thực hiện bằng cách lấy 'seconds'thay vì 'days'và sau đó chia cho 24*60*60.

30
Moment.js sẽ cho giá trị âm nếu a <b. Vì vậy, tính toán mạnh mẽ hơn sẽ là: Math.abs(a.diff(b, 'days'))+1
Vinay Sahni

18
Lưu ý bỏ qua phần thời gian - nếu không bạn sẽ nhận được các kết quả khác nhau cho cùng một ngày nhưng với các thời điểm khác nhau (như từ điều khiển bộ chọn ngày). sử dụng thời điểm (someDate) .startOf ('day') để đặt rõ ràng phần thời gian thành 00:00:00 trước khi thực hiện khác biệt (hoặc bất kỳ thao tác nào khác nhạy cảm với phần thời gian của đối tượng Ngày / thời điểm)
kotpal

Điều này hoạt động nhưng nó không tính đến thành phần thời gian. Cố gắng khác nhau giữa hai cặp sau: (a = "2017-12-24T00: 00: 00Z" và "b = 2017-12-31T23: 59: 59Z") và (a = "2017-12-24T23: 00 : 00Z "và b =" 2017-12-31T23: 59: 59Z "). trả về b.diff (a, 'ngày') <= 7; Cả hai đều trở về đúng. Có cách nào để bao gồm thành phần thời gian trong diff không?
Roobie

1
+1 cho startOf () và endOf (). Tôi đã sử dụng thư viện này trong một vài năm và chưa bao giờ nhận thấy chúng trước đây. Tôi luôn làm +1.
Mike Devenney

3
Hãy nhận biết rằng startOfđột biến thời điểm. Nếu bạn không muốn điều đó, thì hãy làm a.clone().startOf('day').diff(b.clone().startOf('day')).
HRJ

53

Nếu bạn đang sử dụng khoảnh khắc, bạn có thể làm điều đó một cách dễ dàng.

var start = moment("2018-03-10", "YYYY-MM-DD");
var end = moment("2018-03-15", "YYYY-MM-DD");

//Difference in number of days
moment.duration(start.diff(end)).asDays();

//Difference in number of weeks
moment.duration(start.diff(end)).asWeeks();

Nếu bạn muốn tìm sự khác biệt giữa một ngày nhất định và ngày hiện tại theo số ngày (bỏ qua thời gian), hãy đảm bảo xóa thời gian khỏi đối tượng thời điểm của ngày hiện tại như bên dưới

moment().startOf('day')

Để tìm sự khác biệt giữa một ngày nhất định và ngày hiện tại theo số ngày

var given = moment("2018-03-10", "YYYY-MM-DD");
var current = moment().startOf('day');

//Difference in number of days
moment.duration(given.diff(current)).asDays();

2
asDays () trả về cho tôi một số giá trị với số thập phân. Tôi sử dụng current.diff(given, 'days')để nó làm tròn lên.
Vincent

@Vincent có vẻ như bạn đang sử dụng sai cách này. đây chắc chắn là giải pháp sạch hơn, kết quả là đúng so với câu trả lời của @Supr khi 1mất a
Nwawel A Iroume

15

Thử:

//Difference in days

var diff =  Math.floor(( start - end ) / 86400000);
alert(diff);

Tôi nghĩ rằng về cơ bản là đúng nhưng về cơ bản nó không giống với những gì trong OP?
Mũi nhọn

Bởi vì cách anh ấy viết nó tôi không để ý, nhưng ừ, khá nhiều! : P
Richard

5
Tôi không thích số ma thuật .. sẽ tốt hơn nếu số đó được chia thành phương trình tự giải thích
vsync

7

Hãy thử cách này bằng khoảnh khắc (Dễ dàng tính toán các hoạt động ngày trong javascript)

FirstDate.diff (secondDate, 'ngày', sai); // true | false cho giá trị phân số

Kết quả sẽ cho bạn số ngày trong số nguyên.


đây là chữ ký: khoảnh khắc (). diff (Khoảnh khắc | Chuỗi | Số | Ngày | Mảng, Chuỗi, Boolean);
Sumit

1

Ngoài ra, bạn có thể sử dụng mã này: khoảnh khắc ("yourDateHere", "YYYY-MM-DD"). FromNow (). Điều này sẽ tính toán sự khác biệt giữa ngày hôm nay và ngày bạn cung cấp.


1

Điều này làm việc cho tôi:

const from = '2019-01-01';
const to   = '2019-01-08';

Math.abs(
    moment(from, 'YYYY-MM-DD')
      .startOf('day')
      .diff(moment(to, 'YYYY-MM-DD').startOf('day'), 'days')
  ) + 1
);


1

Tôi đã thực hiện một chức năng có thể sử dụng lại nhanh chóng trong ES6 bằng cách sử dụng Moment.js.

const getDaysDiff = (start_date, end_date, date_format = 'YYYY-MM-DD') => {
  const getDateAsArray = (date) => {
    return moment(date.split(/\D+/), date_format);
  }
  return getDateAsArray(end_date).diff(getDateAsArray(start_date), 'days') + 1;
}

console.log(getDaysDiff('2019-10-01', '2019-10-30'));
console.log(getDaysDiff('2019/10/01', '2019/10/30'));
console.log(getDaysDiff('2019.10-01', '2019.10 30'));
console.log(getDaysDiff('2019 10 01', '2019 10 30'));
console.log(getDaysDiff('+++++2019!!/###10/$$01', '2019-10-30'));
console.log(getDaysDiff('2019-10-01-2019', '2019-10-30'));
console.log(getDaysDiff('10-01-2019', '10-30-2019', 'MM-DD-YYYY'));

console.log(getDaysDiff('10-01-2019', '10-30-2019'));
console.log(getDaysDiff('10-01-2019', '2019-10-30', 'MM-DD-YYYY'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js"></script>


-1

MVC tôi có hai văn bản đầu vào 1: số ngày 2: bộ chọn datetime

 @Html.TextBox("HeaderINVID", null, new { @id = "HeaderINVID", @type = "number", @class = "form-control", autocomplete = "off", placeholder = "Day Count " })

  @Html.TextBox("HeaderINVDT", null, new { id = "HeaderINVDT", @class = "form-control format-picker", autocomplete = "off", placeholder = " Date" })

javascipt

để tính số từ ngày sử dụng

    $("#HeaderINVID").bind("keyup", function (e) {
        var INVID = $("#HeaderINVID").val();
        var date = moment()
            .add(INVID, 'd')
            .toDate(); 
        $("#HeaderINVDT").val(moment(date).format('YYYY-MM-DD')) ;
    })

để tính số ngày giữa hai ngày sử dụng

  $("#HeaderINVDT").bind('change', function (e) {
        var StDT = moment($("#HeaderINVDT").val()).startOf('day');
        var NODT = moment().startOf('day');
        $("#HeaderINVID").val(StDT.diff(NODT, 'days'));
    })

đừng quên thêm http://momentjs.com/

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.