วิธีคำนวณจำนวนวันระหว่างวันที่สองวัน


282

ฉันมีวันที่ที่ป้อนสองค่าจากการควบคุมตัวใช้เลือกวันที่ ฉันเลือกวันที่เริ่มต้น 2/2/2012 และวันที่สิ้นสุด 2/7/2012 ฉันได้เขียนรหัสต่อไปนี้เพื่อที่

ฉันควรได้ผลลัพธ์เป็น 6 แต่ได้ 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);
}

ใครสามารถบอกฉันได้ว่าฉันจะได้รับความแตกต่างที่แน่นอน?


ทำไมคุณควรได้รับผล = 6 ??? 07 - 02 = 05 วัน ....
AndréAlçada Padez

1
แต่ช่วงวันตั้งแต่ 2 ถึง 7 คือ 2,3,4,5,6,7 = 6 วัน
Supr

ในขณะที่การเปลี่ยนแปลงฉันต้องการพิจารณาวันที่เริ่มต้นด้วย ....
Vaibhav Deshmukh

17
ดี ... ทำไมไม่เพิ่มเพียง 1 คำตอบ?
แหลม

ปัญหา (หากมีปัญหาเลย) ใช้งานได้ไม่ใช่เรื่องเทคนิค @ คะแนนความคิดเห็นคือคำตอบ นั่นเป็นสาเหตุที่บางคนถามว่าทำไมเราถึงอยู่ในศตวรรษที่ 21
ลีอันโดร

คำตอบ:


666

http://momentjs.com/หรือhttps://date-fns.org/

จากเอกสารช่วงเวลา:

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

หรือเพื่อรวมจุดเริ่มต้น:

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

เต้นเร็วด้วยการประทับเวลาและโซนเวลาด้วยตนเอง

ขึ้นอยู่กับกรณีการใช้งานเฉพาะของคุณคุณสามารถทำได้

  1. ใช้a/b.startOf('day')และ / หรือa/b.endOf('day')เพื่อบังคับให้ diff รวมหรือไม่รวมที่ "สิ้นสุด" (ตามที่ @kotpal แนะนำในความคิดเห็น)
  2. ชุดอาร์กิวเมนต์ที่สามtrueที่จะได้รับ diff ลอยจุดที่คุณสามารถแล้วMath.floor, Math.ceilหรือMath.roundตามความจำเป็น
  3. ตัวเลือกที่ 2 นอกจากนี้ยังสามารถทำได้โดยการ'seconds'แทนแล้วหารด้วย'days'24*60*60

30
moment.js จะให้ค่าลบหาก <b ดังนั้นการคำนวณที่มีประสิทธิภาพมากขึ้นจะเป็น: Math.abs(a.diff(b, 'days'))+1
Vinay Sahni

18
โปรดระวังการละเว้นส่วนเวลา - มิฉะนั้นคุณจะได้ผลลัพธ์ที่แตกต่างกันในวันเดียวกัน แต่มีเวลาต่างกัน (เช่นจากตัวควบคุมตัวใช้เลือกวันที่) ใช้ช่วงเวลา (someDate) .startOf ( 'วัน') อย่างชัดเจนตั้งส่วนเวลาในการ 00:00:00 ก่อนที่จะดำเนินการ diff (หรือการดำเนินการอื่น ๆ ที่มีความไวต่อเวลาส่วนหนึ่งของวันที่ / วัตถุขณะนี้)
kotpal

ใช้งานได้ แต่ไม่คำนึงถึงองค์ประกอบเวลา กำลังพยายามแตกต่างระหว่างสองคู่ต่อไปนี้: (a = "2017-12-24T00: 00: 00Z" และ "b = 2017-12-31T23: 59: 59Z") และ (a = "2017-12-24T23: 00 : 00Z "and b =" 2017-12-31T23: 59: 59Z ") ส่งกลับ b.diff (a, 'วัน') <= 7; ทั้งสองกลับมาจริง มีวิธีรวมส่วนประกอบเวลาในส่วนต่างหรือไม่?
Roobie

1
+1 สำหรับ startOf () และ endOf () ฉันใช้ห้องสมุดนี้มาสองสามปีแล้วและไม่เคยสังเกตมาก่อน ฉันทำ +1 เสมอ
Mike Devenney

3
โปรดระวังว่าstartOfการเปลี่ยนแปลงชั่วขณะ a.clone().startOf('day').diff(b.clone().startOf('day'))หากคุณไม่ต้องการที่แล้วทำ
HRJ

53

หากคุณใช้moment.jsคุณสามารถทำได้อย่างง่ายดาย

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

หากคุณต้องการหาความแตกต่างระหว่างวันที่ที่กำหนดและวันที่ปัจจุบันในจำนวนวัน (ไม่สนใจเวลา) ให้แน่ใจว่าได้ลบเวลาออกจากช่วงเวลาวัตถุวันที่ปัจจุบันตามด้านล่าง

moment().startOf('day')

เพื่อค้นหาความแตกต่างระหว่างวันที่ที่กำหนดและวันที่ปัจจุบันในจำนวนวัน

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 () คืนค่าบางส่วนให้ฉันด้วยทศนิยม ฉันใช้current.diff(given, 'days')ดังนั้นมันจึงปัดขึ้น
Vincent

@ เมื่อเร็ว ๆ นี้ดูเหมือนว่าคุณกำลังใช้วิธีนี้ผิด นี่เป็นทางออกที่สะอาดกว่าอย่างแน่นอนผลลัพธ์จะถูกเปรียบเทียบกับคำตอบของ @Supr ที่ a 1หายไป
Nwawel A Iroume

15

ลอง:

//Difference in days

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

ฉันคิดว่ามันถูกต้อง แต่มันไม่เหมือนกับสิ่งที่อยู่ใน OP ใช่หรือไม่?
Pointy

เพราะวิธีที่เขาเขียนฉันไม่ได้สังเกต แต่ใช่มาก! : P
Richard

5
ฉันไม่ชอบตัวเลขเวทย์มนตร์ .. มันจะดีกว่าถ้าตัวเลขนั้นถูกแบ่งออกเป็นสมการอธิบายตนเอง
vsync

7

ลองใช้การใช้ moment.js (การคำนวณวันที่ค่อนข้างง่ายใน javascript)

firstDate.diff (secondDate, 'วัน', เท็จ); // true | false สำหรับค่าเศษส่วน

ผลลัพธ์จะให้จำนวนวันเป็นจำนวนเต็ม


นี่คือลายเซ็น: สักครู่ (). diff (Moment | String | Number | Date | Array, String, Boolean);
Sumit

1

นอกจากนี้คุณสามารถใช้รหัสนี้: สักครู่ ("yourDateHere", "YYYY-MM-DD") จาก NowNow () วิธีนี้จะคำนวณความแตกต่างระหว่างวันนี้และวันที่คุณระบุ



1

ฉันสร้างฟังก์ชั่นที่ใช้งานซ้ำได้อย่างรวดเร็วใน ES6 โดยใช้ 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 ฉันมีข้อความสองข้อความที่ 1: จำนวนวัน 2: ตัวเลือกวันที่และเวลา

 @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

เพื่อคำนวณจำนวนจากการใช้วันที่

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

เพื่อคำนวณจำนวนวันระหว่างวันที่สองวันที่ใช้

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

อย่าลืมเพิ่ม http://momentjs.com/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.