ความแตกต่างในเดือนระหว่างวันที่สองวันใน JavaScript


143

ฉันจะหาข้อแตกต่างของอ็อบเจ็กต์ Date () สองรายการใน JavaScript ได้อย่างไรในขณะที่ส่งกลับเฉพาะจำนวนเดือนในความแตกต่าง

ความช่วยเหลือใด ๆ จะดีมาก :)


เดือนไม่ใช่หน่วยการวัดที่แม่นยำมากนักเนื่องจากความยาวของเดือนจะเปลี่ยนแปลงไปตามเดือนนั้น ๆ หากช่วงเวลาเป็นเวลา 30 วันระหว่างเดือนมกราคมถึงกุมภาพันธ์นั่นคือน้อยกว่า 1 เดือนหากคุณคิดเป็นเดือน 31 วัน แต่จะมากกว่า 1 เดือนหากคุณพิจารณาวันที่ 28 หรือ 29 กุมภาพันธ์ของเดือนกุมภาพันธ์
Mark Byers

7
คำถามที่กำหนดไว้ไม่ดีนัก 28 กุมภาพันธ์ 23:58 น. 1 มีนาคม 00:01 น. หนึ่งเดือนหรือเปล่า หรือแค่วันเดียว? หรือแค่สามนาที? หรือทั้งสาม?
Thilo

1
@Thilo ใครบางคนที่ต้องใช้สิ่งนี้อาจไม่มีคำตอบเนื่องจากผู้จัดการของพวกเขาไม่รู้ว่าพวกเขากำลังถามอะไรตั้งแต่แรก :)
AlbertEngelB

คำตอบ:


239

คำจำกัดความของ "จำนวนเดือนที่แตกต่างกัน" ขึ้นอยู่กับการตีความมากมาย :-)

คุณสามารถรับปีเดือนและวันของเดือนจากวัตถุวันที่ JavaScript ขึ้นอยู่กับข้อมูลที่คุณกำลังมองหาคุณสามารถใช้ข้อมูลเหล่านั้นเพื่อหาจำนวนเดือนระหว่างสองจุดในเวลา

ตัวอย่างเช่น off-the-cuff:

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;
    months -= d1.getMonth();
    months += d2.getMonth();
    return months <= 0 ? 0 : months;
}

(โปรดทราบว่าค่าเดือนใน JavaScript เริ่มต้นด้วย 0 = มกราคม)

การรวมเดือนเศษ ๆ ในข้างต้นนั้นซับซ้อนกว่ามากเนื่องจากสามวันในเดือนกุมภาพันธ์ทั่วไปเป็นส่วนที่ใหญ่กว่าของเดือนนั้น (~ 10.714%) มากกว่าสามวันในเดือนสิงหาคม (~ 9.677%) และแน่นอนว่าแม้เดือนกุมภาพันธ์จะเป็นเป้าหมายที่เคลื่อนไหว ขึ้นอยู่กับว่าเป็นปีอธิกสุรทิน

นอกจากนี้ยังมีไลบรารีวันที่และเวลาสำหรับ JavaScript ที่อาจทำให้สิ่งนี้ง่ายขึ้น


หมายเหตุ : เคยมี+ 1ในด้านบนที่นี่:

months = (d2.getFullYear() - d1.getFullYear()) * 12;
months -= d1.getMonth() + 1;
// −−−−−−−−−−−−−−−−−−−−^^^^
months += d2.getMonth();

นั่นเป็นเพราะ แต่เดิมฉันพูดว่า:

... สิ่งนี้จะพบจำนวนเดือนเต็มอยู่ระหว่างวันที่สองวันโดยไม่นับเดือนบางส่วน (เช่นไม่รวมเดือนที่แต่ละวันอยู่)

ฉันได้ลบออกด้วยเหตุผลสองประการ:

  1. การไม่นับเดือนบางส่วนปรากฎว่าไม่ใช่สิ่งที่หลาย ๆ คน (ส่วนใหญ่?) ต้องการคำตอบดังนั้นฉันจึงคิดว่าควรแยกพวกเขาออก

  2. มันไม่ได้ผลเสมอไปแม้ตามคำจำกัดความนั้น :-D (ขออภัย)


91

หากคุณไม่พิจารณาวันในเดือนนี่เป็นวิธีแก้ปัญหาที่ง่ายกว่า

function monthDiff(dateFrom, dateTo) {
 return dateTo.getMonth() - dateFrom.getMonth() + 
   (12 * (dateTo.getFullYear() - dateFrom.getFullYear()))
}


//examples
console.log(monthDiff(new Date(2000, 01), new Date(2000, 02))) // 1
console.log(monthDiff(new Date(1999, 02), new Date(2000, 02))) // 12 full year
console.log(monthDiff(new Date(2009, 11), new Date(2010, 0))) // 1

โปรดทราบว่าดัชนีเดือนอิงตาม 0 ซึ่งหมายความว่าและJanuary = 0December = 11


11
นี่คือรหัสที่สั้นและเข้าใจง่ายที่สุดที่ฉันเคยเห็นมา!
Omar

ไม่มีอะไรซับซ้อนกับสิ่งนี้ยกเว้นความจริงที่ว่าทุกเดือนเริ่มต้นจะถูกนับ 31/03/2011 -> 01/05/2011 จะเป็นเวลาสองเดือนเช่นเดียวกับ 01/03/2011 -> 31/05/2011 แต่ควรเป็นสาม
Natim

ถ้าคุณแค่อยากรู้จำนวนเดือนอันนี้เพอร์เฟค !!!!! หากคุณต้องการทราบตามวันในเดือนนี้จะใช้ไม่ได้
OSDM

1
เริ่มจากข้อเท็จจริงที่ว่า 2018/01 และ 2017/01 ห่างกัน 12 เดือน ทำงานย้อนกลับจากที่นั่น คำตอบนี้ได้รับ ;)
Gerard ONeill

1
ขอบคุณ! ฟังก์ชันนี้มีประโยชน์มากสำหรับฉัน
Trương Long

30

บางครั้งคุณอาจต้องการรับเพียงปริมาณของเดือนระหว่างวันที่สองวันโดยไม่สนใจส่วนของวันโดยสิ้นเชิง ตัวอย่างเช่นหากคุณมีวันที่สองวันคือ 2013/06/21 และ 2013/10/18 และคุณสนใจเฉพาะส่วน 2013/06 และ 2013/10 นี่คือสถานการณ์และวิธีแก้ไขที่เป็นไปได้:

var date1=new Date(2013,5,21);//Remember, months are 0 based in JS
var date2=new Date(2013,9,18);
var year1=date1.getFullYear();
var year2=date2.getFullYear();
var month1=date1.getMonth();
var month2=date2.getMonth();
if(month1===0){ //Have to take into account
  month1++;
  month2++;
}
var numberOfMonths; 

1. หากคุณต้องการเพียงแค่จำนวนเดือนระหว่างวันที่สองวันที่ไม่รวมทั้งเดือน 1 และเดือน 2

numberOfMonths = (year2 - year1) * 12 + (month2 - month1) - 1;

2. หากคุณต้องการรวมเดือนใดเดือนหนึ่ง

numberOfMonths = (year2 - year1) * 12 + (month2 - month1);

3. หากคุณต้องการรวมทั้งสองเดือน

numberOfMonths = (year2 - year1) * 12 + (month2 - month1) + 1;

ทำได้ดีนี่! ทำงานได้สมบูรณ์แบบสำหรับฉัน

3
สำหรับข้อสุดท้ายฉันจะแนะนำ: numberOfMonths=(year2-year1)*12+(month2-month1)+1;ซึ่งทำเช่นเดียวกัน แต่ถูกต้องตามความหมายมากกว่าสำหรับฉัน
Natim

ใช่แนวทางที่ดีและสง่างามมากขึ้น
Mikayil Abdullayev

นี่คือคำตอบที่ดีที่สุด ขอบคุณ!
marienke

ง่ายและสะอาด ขอบคุณสำหรับการเขียนโค้ดที่ยอดเยี่ยม
เลขศูนย์และตัว

28

นี่คือฟังก์ชันที่ระบุจำนวนเดือนระหว่างวันที่ 2 วันที่ถูกต้อง
พฤติกรรมเริ่มต้นจะนับเฉพาะทั้งเดือนเช่น 3 เดือนและ 1 วันจะส่งผลให้ 3 เดือนแตกต่างกัน คุณสามารถป้องกันได้โดยตั้งค่าroundUpFractionalMonthsพารามิเตอร์เป็นtrueดังนั้นผลต่าง 3 เดือนและ 1 วันจะถูกส่งกลับเป็น 4 เดือน

คำตอบที่ยอมรับข้างต้น (คำตอบของ TJ Crowder) ไม่ถูกต้องบางครั้งก็ส่งคืนค่าที่ไม่ถูกต้อง

ตัวอย่างเช่นmonthDiff(new Date('Jul 01, 2015'), new Date('Aug 05, 2015'))ผลตอบแทน0ที่ผิดอย่างเห็นได้ชัด ความแตกต่างที่ถูกต้องคือปัดเศษขึ้น 1 เดือนหรือ 2 เดือน

นี่คือฟังก์ชันที่ฉันเขียน:

function getMonthsBetween(date1,date2,roundUpFractionalMonths)
{
    //Months will be calculated between start and end dates.
    //Make sure start date is less than end date.
    //But remember if the difference should be negative.
    var startDate=date1;
    var endDate=date2;
    var inverse=false;
    if(date1>date2)
    {
        startDate=date2;
        endDate=date1;
        inverse=true;
    }

    //Calculate the differences between the start and end dates
    var yearsDifference=endDate.getFullYear()-startDate.getFullYear();
    var monthsDifference=endDate.getMonth()-startDate.getMonth();
    var daysDifference=endDate.getDate()-startDate.getDate();

    var monthCorrection=0;
    //If roundUpFractionalMonths is true, check if an extra month needs to be added from rounding up.
    //The difference is done by ceiling (round up), e.g. 3 months and 1 day will be 4 months.
    if(roundUpFractionalMonths===true && daysDifference>0)
    {
        monthCorrection=1;
    }
    //If the day difference between the 2 months is negative, the last month is not a whole month.
    else if(roundUpFractionalMonths!==true && daysDifference<0)
    {
        monthCorrection=-1;
    }

    return (inverse?-1:1)*(yearsDifference*12+monthsDifference+monthCorrection);
};

6
แต่อย่างจริงจังใครโหวตเรื่องนี้? เขาพูดถูกคำตอบที่ได้รับการยอมรับคือ ... ผิด
Michael Blackburn

2
นี่คือคำตอบที่ดีที่สุด
Kalyan Chavali

ไม่ถูกต้องถ้าสมมติว่า date1 คือ 22 มกราคมและ date2 คือ 22 สิงหาคม จากนั้นจะส่งกลับ 7 ซึ่งเห็นได้ชัดว่าควรเป็น 8?
Nicolai Harbo

ตอบรับคำตอบนี้ ถูกต้องมากกว่าที่ยอมรับ ตัวอย่างเช่นคำตอบที่ยอมรับจะไม่คำนวณวัน
Munkhdelger Tumenbayar

คำตอบที่ยอมรับของ Crowder ได้รับการอัปเดตแล้ว อาจยังคงมีความแตกต่างที่สำคัญระหว่างคำตอบนี้และคำตอบนี้ แต่ในขณะที่เขียนนี้ข้อกังวลที่ระบุไว้ที่นี่ได้รับการแก้ไข
clozach

23

หากคุณต้องการนับทั้งเดือนไม่ว่าเดือนนั้นจะเป็น 28, 29, 30 หรือ 31 วันก็ตาม ด้านล่างควรใช้งานได้

var months = to.getMonth() - from.getMonth() 
    + (12 * (to.getFullYear() - from.getFullYear()));

if(to.getDate() < from.getDate()){
    months--;
}
return months;

นี่เป็นคำตอบแบบขยายhttps://stackoverflow.com/a/4312956/1987208แต่แก้ไขกรณีที่คำนวณ 1 เดือนสำหรับกรณีตั้งแต่วันที่ 31 มกราคมถึง 1 กุมภาพันธ์ (1 วัน)

ซึ่งจะครอบคลุมสิ่งต่อไปนี้

  • 1 มกราคมถึง 31 มกราคม ---> 30 วัน ---> จะให้ผลลัพธ์เป็น 0 (ตรรกะเนื่องจากไม่ใช่เดือนเต็ม)
  • 1 กุมภาพันธ์ถึง 1 มีนาคม ---> 28 หรือ 29 วัน ---> จะได้ผลลัพธ์เป็น 1 (ตรรกะเนื่องจากเป็นเดือนเต็ม)
  • 15 กุมภาพันธ์ถึง 15 มีนาคม ---> 28 หรือ 29 วัน ---> จะส่งผลเป็น 1 (ตรรกะนับจากเดือนที่ผ่านไป)
  • 31 มกราคมถึง 1 กุมภาพันธ์ ---> 1 วัน ---> จะให้ผลลัพธ์เป็น 0 (ชัดเจน แต่คำตอบที่กล่าวถึงในโพสต์ผลลัพธ์ใน 1 เดือน)

2
ท่าคือสิ่งที่ฉันคิดว่าฉันมาที่นี่เพื่อตรวจสอบและนั่นเป็นคำตอบเดียวที่สมเหตุสมผลสำหรับฉัน
Andreas

2
วิธีนี้ใช้ไม่ได้เมื่อเปรียบเทียบสองเดือนที่เดือนสั้นกว่า ตัวอย่างเช่นตั้งแต่วันที่ 31 มีนาคมถึง 30 เมษายน นั่นคือทั้งหมดของเดือนเมษายนดังนั้นคำตอบควรเป็น "1"
Michael Blackburn

7

ความแตกต่างในเดือนระหว่างวันที่สองวันใน JavaScript:

 start_date = new Date(year, month, day); //Create start date object by passing appropiate argument
 end_date = new Date(new Date(year, month, day)

จำนวนเดือนทั้งหมดระหว่าง start_date ถึง end_date:

 total_months = (end_date.getFullYear() - start_date.getFullYear())*12 + (end_date.getMonth() - start_date.getMonth())

6

ฉันรู้ว่านี่มันสายไปแล้ว แต่ยังไงก็โพสต์ไว้เผื่อว่าจะช่วยคนอื่นได้ นี่คือฟังก์ชันที่ฉันคิดขึ้นมาซึ่งดูเหมือนจะทำงานได้ดีในการนับความแตกต่างในเดือนระหว่างวันที่สองวัน เป็นที่ยอมรับว่าแย่กว่า Mr. Crowder's มาก แต่ให้ผลลัพธ์ที่แม่นยำกว่าโดยการก้าวผ่านวัตถุวันที่ มันอยู่ใน AS3 แต่คุณควรจะสามารถวางการพิมพ์ที่แข็งแกร่งและคุณจะมี JS อย่าลังเลที่จะทำให้ดีขึ้นเมื่อมองหาใครก็ได้ที่นั่น!

    function countMonths ( startDate:Date, endDate:Date ):int
    {
        var stepDate:Date = new Date;
        stepDate.time = startDate.time;
        var monthCount:int;

        while( stepDate.time <= endDate.time ) { 
            stepDate.month += 1;
            monthCount += 1;
        }           

        if ( stepDate != endDate ) { 
            monthCount -= 1;
        }

        return monthCount;
    }

นี่เป็นแนวทางที่ถูกต้องที่สุดสำหรับสถานการณ์ส่วนใหญ่ มีข้อยกเว้นและความหลากหลายมากมายในปฏิทินของเราแนวทางที่ดีที่สุดคือมอบหมายให้จัดการกับไลบรารีที่ผ่านการทดสอบอย่างดีเช่น Date () สำหรับช่วงเวลาส่วนใหญ่ (สั้น ๆ ) สิ่งนี้จะส่งคืนคำตอบเดียวกันกับวิธีการคำนวณ แต่เมื่อคุณต้องจัดการกับช่วงเวลาที่ยาวนาน (รวมถึงปีอธิกสุรทินปีอธิกสุรทินปีที่ไม่ก้าวกระโดดปีอธิกสุรทิน วินาที ฯลฯ ) คุณมีแนวโน้มที่จะพบข้อยกเว้นที่การลบเดือนและการเพิ่มปีจะไม่ถูกต้อง ดูคำตอบของฉันสำหรับข้อยกเว้นเมื่อการคำนวณจะดีที่สุด
Michael Blackburn

5

หากต้องการขยายคำตอบของ @ TJ หากคุณกำลังมองหาเดือนที่เรียบง่ายแทนที่จะเป็นเดือนปฏิทินแบบเต็มคุณสามารถตรวจสอบได้ว่าวันที่ของ d2 มากกว่าหรือเท่ากับ d1 หรือไม่ นั่นคือถ้า d2 ช้ากว่าเดือนของมันมากกว่า d1 อยู่ในเดือนนั้นจะมีอีก 1 เดือน ดังนั้นคุณควรจะทำได้:

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;
    months -= d1.getMonth() + 1;
    months += d2.getMonth();
    // edit: increment months if d2 comes later in its month than d1 in its month
    if (d2.getDate() >= d1.getDate())
        months++
    // end edit
    return months <= 0 ? 0 : months;
}

monthDiff(
    new Date(2008, 10, 4), // November 4th, 2008
    new Date(2010, 2, 12)  // March 12th, 2010
);
// Result: 16; 4 Nov – 4 Dec '08, 4 Dec '08 – 4 Dec '09, 4 Dec '09 – 4 March '10

สิ่งนี้ไม่ได้คำนึงถึงปัญหาด้านเวลาโดยสิ้นเชิง (เช่น 3 มีนาคมเวลา 16:00 น. และ 3 เมษายนเวลา 15:00 น.) แต่แม่นยำกว่าและใช้รหัสเพียงไม่กี่บรรทัด


5

พิจารณาแต่ละวันในรูปแบบของเดือนแล้วลบเพื่อหาความแตกต่าง

var past_date = new Date('11/1/2014');
var current_date = new Date();

var difference = (current_date.getFullYear()*12 + current_date.getMonth()) - (past_date.getFullYear()*12 + past_date.getMonth());

สิ่งนี้จะทำให้คุณได้รับความแตกต่างของเดือนระหว่างวันที่สองวันโดยไม่สนใจวัน


5

คุณยังสามารถพิจารณาโซลูชันนี้ได้ซึ่งfunctionจะคืนค่าความแตกต่างของเดือนเป็นจำนวนเต็มหรือตัวเลข

การผ่านวันที่เริ่มต้นเป็นวันแรกหรือครั้งสุดท้ายparamเป็นการยอมรับข้อผิดพลาด ความหมายฟังก์ชันจะยังคงส่งคืนค่าเดิม

const diffInMonths = (end, start) => {
   var timeDiff = Math.abs(end.getTime() - start.getTime());
   return Math.round(timeDiff / (2e3 * 3600 * 365.25));
}

const result = diffInMonths(new Date(2015, 3, 28), new Date(2010, 1, 25));

// shows month difference as integer/number
console.log(result);


1
คุณควรคูณด้วย 365.25 เพื่อพิจารณาปีอธิกสุรทิน
darryn.ten

4

มีสองวิธีคือคณิตศาสตร์ & แบบรวดเร็ว แต่ขึ้นอยู่กับความหลากหลายในปฏิทินหรือการทำซ้ำ & ช้า แต่จัดการกับสิ่งแปลกประหลาดทั้งหมด (หรืออย่างน้อยผู้ได้รับมอบหมายที่จัดการพวกเขาไปยังไลบรารีที่ผ่านการทดสอบอย่างดี)

หากคุณวนซ้ำตามปฏิทินให้เพิ่มวันที่เริ่มต้นทีละหนึ่งเดือนและดูว่าเราผ่านวันที่สิ้นสุดหรือไม่ สิ่งนี้จะมอบหมายการจัดการความผิดปกติให้กับคลาส Date () ในตัว แต่อาจช้าหากคุณทำสิ่งนี้เป็นจำนวนมาก คำตอบของเจมส์ใช้แนวทางนี้ เท่าที่ฉันไม่ชอบแนวคิดนี้ฉันคิดว่านี่เป็นวิธีที่ "ปลอดภัยที่สุด" และหากคุณทำการคำนวณเพียงครั้งเดียวความแตกต่างของประสิทธิภาพก็ไม่สำคัญ เรามักจะพยายามเพิ่มประสิทธิภาพงานมากเกินไปซึ่งจะดำเนินการเพียงครั้งเดียว

ตอนนี้หากคุณกำลังคำนวณฟังก์ชันนี้ในชุดข้อมูลคุณอาจไม่ต้องการเรียกใช้ฟังก์ชันนั้นในแต่ละแถว (หรือพระเจ้าห้ามหลายครั้งต่อระเบียน) ในกรณีนี้คุณสามารถใช้คำตอบอื่น ๆ ได้เกือบทุกข้อยกเว้นคำตอบที่ยอมรับซึ่งผิด (ความแตกต่างระหว่างnew Date()และnew Date()คือ -1)?

นี่คือการแทงของฉันด้วยวิธีการทางคณิตศาสตร์และรวดเร็วซึ่งอธิบายถึงความยาวของเดือนและปีอธิกสุรทินที่แตกต่างกัน คุณควรใช้ฟังก์ชันเช่นนี้ก็ต่อเมื่อคุณจะนำสิ่งนี้ไปใช้กับชุดข้อมูล (ทำการคำนวณนี้ซ้ำไปซ้ำมา) หากคุณต้องการทำเพียงครั้งเดียวให้ใช้วิธีการทำซ้ำของ James ด้านบนในขณะที่คุณกำลังมอบหมายให้จัดการข้อยกเว้น (หลายข้อ) ทั้งหมดของอ็อบเจ็กต์ Date ()

function diffInMonths(from, to){
    var months = to.getMonth() - from.getMonth() + (12 * (to.getFullYear() - from.getFullYear()));

    if(to.getDate() < from.getDate()){
        var newFrom = new Date(to.getFullYear(),to.getMonth(),from.getDate());
        if (to < newFrom  && to.getMonth() == newFrom.getMonth() && to.getYear() %4 != 0){
            months--;
        }
    }

    return months;
}

3

ที่นี่คุณไปแนวทางอื่นที่มีการวนซ้ำน้อยลง:

calculateTotalMonthsDifference = function(firstDate, secondDate) {
        var fm = firstDate.getMonth();
        var fy = firstDate.getFullYear();
        var sm = secondDate.getMonth();
        var sy = secondDate.getFullYear();
        var months = Math.abs(((fy - sy) * 12) + fm - sm);
        var firstBefore = firstDate > secondDate;
        firstDate.setFullYear(sy);
        firstDate.setMonth(sm);
        firstBefore ? firstDate < secondDate ? months-- : "" : secondDate < firstDate ? months-- : "";
        return months;
}

1
ระวังวิธีนี้: มัน (ค่อนข้างชัดเจนเมื่อคุณอ่านอย่างละเอียด) จะเปลี่ยนวันที่แรกที่ส่งกลับไปยังผู้โทร (เนื่องจากวันที่จะถูกส่งผ่านโดยการอ้างอิง)
Andiih

2

คำนวณความแตกต่างระหว่างวันที่สองวันรวมถึงเศษของเดือน (วัน)


var difference = (date2.getDate() - date1.getDate()) / 30 +
    date2.getMonth() - date1.getMonth() +
    (12 * (date2.getFullYear() - date1.getFullYear()));

ตัวอย่างเช่น
date1 : 24/09/2015 (24 กันยายน 2015)
date2 : 09/11/2015 (9 พ.ย. 2558)
ความแตกต่าง: 2.5 (เดือน)



1
function calcualteMonthYr(){
    var fromDate =new Date($('#txtDurationFrom2').val()); //date picker (text fields)
    var toDate = new Date($('#txtDurationTo2').val());

var months=0;
        months = (toDate.getFullYear() - fromDate.getFullYear()) * 12;
        months -= fromDate.getMonth();
        months += toDate.getMonth();
            if (toDate.getDate() < fromDate.getDate()){
                months--;
            }
    $('#txtTimePeriod2').val(months);
}

1

รหัสต่อไปนี้จะคืนค่าเต็มเดือนระหว่างวันที่สองวันโดยคำนึงถึงจำนวนวันของเดือนบางส่วนด้วย

var monthDiff = function(d1, d2) {
  if( d2 < d1 ) { 
    var dTmp = d2;
    d2 = d1;
    d1 = dTmp;
  }

  var months = (d2.getFullYear() - d1.getFullYear()) * 12;
  months -= d1.getMonth() + 1;
  months += d2.getMonth();

  if( d1.getDate() <= d2.getDate() ) months += 1;

  return months;
}

monthDiff(new Date(2015, 01, 20), new Date(2015, 02, 20))
> 1

monthDiff(new Date(2015, 01, 20), new Date(2015, 02, 19))
> 0

monthDiff(new Date(2015, 01, 20), new Date(2015, 01, 22))
> 0

1
function monthDiff(d1, d2) {
var months, d1day, d2day, d1new, d2new, diffdate,d2month,d2year,d1maxday,d2maxday;
months = (d2.getFullYear() - d1.getFullYear()) * 12;
months -= d1.getMonth() + 1;
months += d2.getMonth();
months = (months <= 0 ? 0 : months);
d1day = d1.getDate();
d2day = d2.getDate();
if(d1day > d2day)
{
    d2month = d2.getMonth();
    d2year = d2.getFullYear();
    d1new = new Date(d2year, d2month-1, d1day,0,0,0,0);
    var timeDiff = Math.abs(d2.getTime() - d1new.getTime());
          diffdate = Math.abs(Math.ceil(timeDiff / (1000 * 3600 * 24))); 
    d1new = new Date(d2year, d2month, 1,0,0,0,0);
    d1new.setDate(d1new.getDate()-1);
    d1maxday = d1new.getDate();
    months += diffdate / d1maxday;
}
else
{
      if(!(d1.getMonth() == d2.getMonth() && d1.getFullYear() == d2.getFullYear()))
    {
        months += 1;
    }
    diffdate = d2day - d1day + 1;
    d2month = d2.getMonth();
    d2year = d2.getFullYear();
    d2new = new Date(d2year, d2month + 1, 1, 0, 0, 0, 0);
    d2new.setDate(d2new.getDate()-1);
    d2maxday = d2new.getDate();
    months += diffdate / d2maxday;
}

return months;

}



1
function monthDiff(date1, date2, countDays) {

  countDays = (typeof countDays !== 'undefined') ?  countDays : false;

  if (!date1 || !date2) {
    return 0;
  }

  let bigDate = date1;
  let smallDate = date2;

  if (date1 < date2) {
    bigDate = date2;
    smallDate = date1;
  }

  let monthsCount = (bigDate.getFullYear() - smallDate.getFullYear()) * 12 + (bigDate.getMonth() - smallDate.getMonth());

  if (countDays && bigDate.getDate() < smallDate.getDate()) {
    --monthsCount;
  }

  return monthsCount;
}

0

ดูสิ่งที่ฉันใช้:

function monthDiff() {
    var startdate = Date.parseExact($("#startingDate").val(), "dd/MM/yyyy");
    var enddate = Date.parseExact($("#endingDate").val(), "dd/MM/yyyy");
    var months = 0;
    while (startdate < enddate) {
        if (startdate.getMonth() === 1 && startdate.getDate() === 28) {
            months++;
            startdate.addMonths(1);
            startdate.addDays(2);
        } else {
            months++;
            startdate.addMonths(1);
        }
    }
    return months;
}

0

นอกจากนี้ยังนับวันและแปลงเป็นเดือน

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;   //calculates months between two years
    months -= d1.getMonth() + 1; 
    months += d2.getMonth();  //calculates number of complete months between two months
    day1 = 30-d1.getDate();  
    day2 = day1 + d2.getDate();
    months += parseInt(day2/30);  //calculates no of complete months lie between two dates
    return months <= 0 ? 0 : months;
}

monthDiff(
    new Date(2017, 8, 8), // Aug 8th, 2017    (d1)
    new Date(2017, 12, 12)  // Dec 12th, 2017   (d2)
);
//return value will be 4 months 

คุณสามารถเพิ่มคำอธิบายโดยละเอียดเกี่ยวกับวิธีการทำงานนี้ได้หรือไม่? สิ่งนี้จะทำให้คำตอบดีขึ้น
serge1peshcoff

เดือนสมมติมี 30 วันหรือไม่?
Ben Taliadoros

0

จำนวนเดือนที่วันและเวลาไม่สำคัญ

ในกรณีนี้ฉันไม่เกี่ยวกับเดือนเต็มเดือนส่วนระยะเวลาของเดือน ฯลฯ ฉันแค่ต้องรู้จำนวนเดือน กรณีในโลกแห่งความเป็นจริงที่เกี่ยวข้องจะเป็นที่ที่ต้องรายงานทุกเดือนและฉันต้องการทราบว่าควรมีรายงานจำนวนเท่าใด

ตัวอย่าง:

  • มกราคม = 1 เดือน
  • มกราคม - กุมภาพันธ์ = 2 เดือน
  • พฤศจิกายน - มกราคม = 3 เดือน

นี่คือตัวอย่างโค้ดที่อธิบายอย่างละเอียดเพื่อแสดงว่าตัวเลขจะไปที่ใด

ลองใช้เวลา 2 การประทับเวลาซึ่งน่าจะได้ผลใน 4 เดือน

  • วันที่ 13 พฤศจิกายน 2019 เวลา: 1573621200000
  • วันที่ 20 กุมภาพันธ์ 2020 เวลาประทับ: 1582261140000

อาจแตกต่างกันเล็กน้อยกับเขตเวลา / เวลาที่ดึงออกมา วันนาทีและวินาทีไม่สำคัญและสามารถรวมไว้ในการประทับเวลาได้ แต่เราจะเพิกเฉยต่อการคำนวณจริงของเรา

ขั้นตอนที่ 1: แปลงเวลาประทับเป็นวันที่ JavaScript

let dateRangeStartConverted = new Date(1573621200000);
let dateRangeEndConverted = new Date(1582261140000);

ขั้นตอนที่ 2: รับค่าจำนวนเต็มสำหรับเดือน / ปี

let startingMonth = dateRangeStartConverted.getMonth();
let startingYear = dateRangeStartConverted.getFullYear();
let endingMonth = dateRangeEndConverted.getMonth();
let endingYear = dateRangeEndConverted.getFullYear();

สิ่งนี้ทำให้เรา

  • เดือนเริ่มต้น: 11
  • ปีที่เริ่ม: 2562
  • สิ้นเดือน: 2
  • ปีที่สิ้นสุด: 2020

ขั้นตอนที่ 3: เพิ่ม(12 * (endYear - startYear)) + 1ในเดือนสิ้นสุด

  • ทำให้เดือนเริ่มต้นของเราอยู่ที่ 11
  • สิ่งนี้ทำให้เดือนสิ้นสุดของเราเท่ากับ 15 2 + (12 * (2020 - 2019)) + 1 = 15

ขั้นตอนที่ 4: ลบเดือน

15 - 11 = 4; เราได้ผลลัพธ์ 4 เดือนของเรา

ตัวอย่างเดือน 29

พฤศจิกายน 2019 ถึงมีนาคม 2565 เป็น 29 เดือน หากคุณใส่สิ่งเหล่านี้ลงในสเปรดชีต excel คุณจะเห็น 29 แถว

  • เดือนเริ่มต้นของเราคือ 11
  • เดือนสิ้นสุดของเราคือ 40 3 + (12 * (2022-2019)) + 1

40 - 11 = 29


0
getMonthDiff(d1, d2) {
    var year1 = dt1.getFullYear();
    var year2 = dt2.getFullYear();
    var month1 = dt1.getMonth();
    var month2 = dt2.getMonth();
    var day1 = dt1.getDate();
    var day2 = dt2.getDate();
    var months = month2 - month1;
    var years = year2 -year1
    days = day2 - day1;
    if (days < 0) {
        months -= 1;
    }
    if (months < 0) {
        months += 12;
    }
    return months + years*!2;
}

0

ค่าใด ๆ จะถูกส่งกลับพร้อมกับค่าสัมบูรณ์

function differenceInMonths() {
    if (firstDate > secondDate) [firstDate, secondDate] = [secondDate, firstDate];
    let diffMonths = (secondDate.getFullYear() - firstDate.getFullYear()) * 12;
    diffMonths -= firstDate.getMonth();
    diffMonths += secondDate.getMonth();
    return diffMonths;
}
 

อาจต้องการใส่firstDateและsecondDateลงในพารามิเตอร์ฟังก์ชันของคุณ
Calculuswhiz

-2
anyVar = (((DisplayTo.getFullYear() * 12) + DisplayTo.getMonth()) - ((DisplayFrom.getFullYear() * 12) + DisplayFrom.getMonth()));

3
แม้ว่าข้อมูลโค้ดนี้อาจเป็นวิธีแก้ปัญหา แต่การมีคำอธิบายจะช่วยปรับปรุงคุณภาพของโพสต์ของคุณได้มาก โปรดจำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและบุคคลเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำโค้ดของคุณ
Eugene Podskal

การโพสต์คำตอบนั้นใช้ไม่มากนักซึ่งขึ้นอยู่กับฟังก์ชันที่ไม่ได้อธิบายหรือกำหนดไว้ในคำตอบ
RobG

-7

แนวทางหนึ่งคือการเขียน Java Web Service (REST / JSON) แบบธรรมดาที่ใช้ไลบรารี JODA

http://joda-time.sourceforge.net/faq.html#datediff

เพื่อคำนวณความแตกต่างระหว่างวันที่สองวันและเรียกใช้บริการนั้นจากจาวาสคริปต์

ถือว่าแบ็คเอนด์ของคุณอยู่ใน Java

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