ฟังก์ชัน JavaScript เพื่อเพิ่ม X เดือนไปยังวันที่


209

ฉันกำลังมองหาวิธีที่ง่ายที่สุดและสะอาดที่สุดในการเพิ่ม X เดือนไปยังวันที่ JavaScript

ฉันไม่ต้องการจัดการกับการพลิกของปีหรือมีการเขียนฟังก์ชั่นของตัวเอง

มีบางอย่างในตัวที่สามารถทำสิ่งนี้ได้หรือไม่?


4
ลองเพิ่มวิธีการที่วัตถุต้นแบบของวันที่เช่น --------------- Date.prototype.addMonth = function (n) {return new Date (this.setMonth (this.getMonth ( ) + n)); };
Moises Hidalgo

1
@ kr37 คำตอบของ Moises Hidalgo จะไม่ทำงานอย่างถูกต้องหากเดือนเป้าหมายไม่มีหมายเลขวันของวันนี้ คำตอบของ bmpasini ก็สามารถจัดการเรื่องนี้ได้เช่นกัน
Alexandru Severin

คำตอบที่นี่จะไม่ดีมาก, คำตอบที่ดีอยู่ที่การเพิ่มเดือนถึงวันที่ในจาวาสคริปต์
RobG

คำตอบ:


278

ฟังก์ชั่นต่อไปนี้จะเพิ่มเดือนในวันที่ใน JavaScript (ที่มา ) โดยคำนึงถึงการหมุนเวียนปีบัญชีและความยาวของเดือนที่แตกต่างกัน:

function addMonths(date, months) {
    var d = date.getDate();
    date.setMonth(date.getMonth() + +months);
    if (date.getDate() != d) {
      date.setDate(0);
    }
    return date;
}

// Add 12 months to 29 Feb 2016 -> 28 Feb 2017
console.log(addMonths(new Date(2016,1,29),12).toString());

// Subtract 1 month from 1 Jan 2017 -> 1 Dec 2016
console.log(addMonths(new Date(2017,0,1),-1).toString());

// Subtract 2 months from 31 Jan 2017 -> 30 Nov 2016
console.log(addMonths(new Date(2017,0,31),-2).toString());

// Add 2 months to 31 Dec 2016 -> 28 Feb 2017
console.log(addMonths(new Date(2016,11,31),2).toString());

การแก้ปัญหาข้างต้นครอบคลุมกรณีขอบของการย้ายจากเดือนที่มีจำนวนวันมากกว่าเดือนปลายทาง เช่น.

  • เพิ่มสิบสองเดือนถึง 29 กุมภาพันธ์ 2020 (ควรเป็น 28 กุมภาพันธ์ 2021)
  • เพิ่มหนึ่งเดือนถึง 31 สิงหาคม 2020 (ควรเป็น 30 กันยายน 2020)

หากวันของเดือนเปลี่ยนไปเมื่อสมัครsetMonthเราก็รู้ว่าเราล้นในเดือนถัดไปเนื่องจากความแตกต่างของระยะเวลาในเดือน ในกรณีนี้เราใช้setDate(0)เพื่อย้ายกลับไปยังวันสุดท้ายของเดือนก่อนหน้า

หมายเหตุ: คำตอบรุ่นนี้จะแทนที่รุ่นก่อนหน้า (ด้านล่าง) ที่ไม่ได้จัดการกับความยาวของเดือนที่แตกต่างกัน

var x = 12; //or whatever offset
var CurrentDate = new Date();
console.log("Current date:", CurrentDate);
CurrentDate.setMonth(CurrentDate.getMonth() + x);
console.log("Date after " + x + " months:", CurrentDate);

130
ระวัง - วิธีนี้ใช้ไม่ได้กับกรณีขอบเช่นเพิ่มในวันที่ 31 ของเดือนส่วนใหญ่ ตัวอย่างเช่น 31 ตุลาคม 2011 + 1 เดือนโดยใช้วิธีนี้คือ 01 ธันวาคม 2011 โดยใช้วัตถุวันที่มาตรฐานของ Javascript
ตาด

6
จับดีตาด ฉันประหลาดใจที่ฉันไม่เห็นสิ่งนั้น โปรดทราบว่า T-SQL เลือก DATEADD (เดือน, 1, '2011-10-31') ให้ผลตอบแทน '2011-11-30' ซึ่งฉันคิดว่าสมเหตุสมผล ฉันได้รับ 10 โหวตด้วยคำตอบที่ไม่ดี เย็น. :-)
ชาด

2
นอกจากนี้ดูปีอธิกสุรทิน - เพิ่ม 1 ปีถึง 29 กุมภาพันธ์ในปีอธิกสุรทินจะให้ผลลัพธ์ที่ไม่คาดคิดขึ้นอยู่กับภาษาที่คุณใช้ (เป็นคำตอบทั่วไป) นี่คือสิ่งที่เกิดขึ้นกับแพลตฟอร์มคลาวด์ Microsoft Azure เป็นเวลาหลายชั่วโมงในปี 2012
Ben Walding

15
มีaddMonthsฟังก์ชั่นที่นี่ที่ให้ความเคารพสิ้นเดือน (เช่น2012-01-31 + 1 month = 2012-02-29และอื่น ๆ )
RobG

3
เพียงเพิ่มเพื่อตั้งวันที่ 1 ของทุกเดือน: today.setHours (0, 0, 0, 0); today.setDate (1);
Alexey Strakh

56

ฉันใช้ห้องสมุดmoment.jsสำหรับการปรับเปลี่ยนวันที่ โค้ดตัวอย่างเพื่อเพิ่มหนึ่งเดือน:

var startDate = new Date(...);
var endDateMoment = moment(startDate); // moment(...) can also be used to parse dates in string format
endDateMoment.add(1, 'months');

12
สำหรับสติของคุณเองใช้ moment.js
ก.ย.

3
เห็นด้วยอย่างยิ่งกับ @garry: use moment.js
Michel

2
ฉันยอมรับว่านี่เป็นวิธีที่สะอาดที่สุด แต่คำถามคือ "มีอะไรบางอย่างในตัวที่สามารถทำได้หรือไม่" ช่วงเวลาเพิ่ม Kb หลายสิบขนาดหน้า
Evgeny

นี่เป็นสิ่งที่ดี ไม่มีปลั๊กอินอื่นที่ฉันพบในเน็ตที่สามารถทำได้ดีกว่านี้มาก
Eraniichan

26

ฟังก์ชั่นนี้จัดการกับตัวเรือนขอบและรวดเร็ว:

function addMonthsUTC (date, count) {
  if (date && count) {
    var m, d = (date = new Date(+date)).getUTCDate()

    date.setUTCMonth(date.getUTCMonth() + count, 1)
    m = date.getUTCMonth()
    date.setUTCDate(d)
    if (date.getUTCMonth() !== m) date.setUTCDate(0)
  }
  return date
}

ทดสอบ:

> d = new Date('2016-01-31T00:00:00Z');
Sat Jan 30 2016 18:00:00 GMT-0600 (CST)
> d = addMonthsUTC(d, 1);
Sun Feb 28 2016 18:00:00 GMT-0600 (CST)
> d = addMonthsUTC(d, 1);
Mon Mar 28 2016 18:00:00 GMT-0600 (CST)
> d.toISOString()
"2016-03-29T00:00:00.000Z"

อัพเดทสำหรับวันที่ที่ไม่ใช่ UTC: (โดย A.Hatchkins)

function addMonths (date, count) {
  if (date && count) {
    var m, d = (date = new Date(+date)).getDate()

    date.setMonth(date.getMonth() + count, 1)
    m = date.getMonth()
    date.setDate(d)
    if (date.getMonth() !== m) date.setDate(0)
  }
  return date
}

ทดสอบ:

> d = new Date(2016,0,31);
Sun Jan 31 2016 00:00:00 GMT-0600 (CST)
> d = addMonths(d, 1);
Mon Feb 29 2016 00:00:00 GMT-0600 (CST)
> d = addMonths(d, 1);
Tue Mar 29 2016 00:00:00 GMT-0600 (CST)
> d.toISOString()
"2016-03-29T06:00:00.000Z"

คำตอบที่สมเหตุสมผลเท่านั้นที่นี่ แต่ต้องใช้ความระมัดระวังสำหรับวันที่ไม่ได้เป็น UTC มันอาจให้ผลลัพธ์ที่ไม่คาดคิด (เช่น 31 ม.ค. + 1 เดือน = 1 มีนาคมสำหรับ UTC + เที่ยงคืนของเวลา 1)
Antony Hatchkins

1
ปัญหาอื่นก็คือว่ามันทั้งปรับเปลี่ยนวันที่เดิมและส่งกลับค่าการปรับเปลี่ยน อาจจะเหมาะสมที่จะเพิ่มลงในต้นแบบวันที่หรือใช้ตัวแปรท้องถิ่นสำหรับวันที่เปลี่ยนในฟังก์ชั่น?
Antony Hatchkins

ขอบคุณแอนโทนีตัวแปรในท้องที่เหมาะสม
aMarCruz

1
ฉันขอแนะนำให้ลบบรรทัด "วันที่ส่งคืน" หรือเพิ่ม var ท้องถิ่น
Antony Hatchkins

อัปเดตโดยใช้ตัวแปรท้องถิ่นและการทดสอบแยก
aMarCruz

12

เมื่อพิจารณาจากคำตอบเหล่านี้จะไม่มีผลกับปีปัจจุบันเมื่อเดือนเปลี่ยนไปคุณสามารถหาคำตอบที่ฉันทำด้านล่างซึ่งควรจัดการได้:

วิธีการ:

Date.prototype.addMonths = function (m) {
    var d = new Date(this);
    var years = Math.floor(m / 12);
    var months = m - (years * 12);
    if (years) d.setFullYear(d.getFullYear() + years);
    if (months) d.setMonth(d.getMonth() + months);
    return d;
}

การใช้งาน:

return new Date().addMonths(2);

คำตอบนี้ไม่นับรวมเดือนที่เพิ่มขึ้นซึ่งไม่มีวันที่ที่สอดคล้องกันในเดือนที่เกิดขึ้น (เช่น 31 มกราคม + 1 เดือน => 2 หรือ 3 มี.ค. ) ดูเหมือนว่าจะมีปัญหากับการเพิ่มวันที่มากกว่า 12 เดือน: ไม่มี ไม่จำเป็นเมื่อเพิ่มพูด 13 เดือนเพิ่ม 1 ปีและ 1 เดือน เพียงเพิ่ม 13 เดือน
RobG

9

ที่นำมาจาก@bmpsiniและ@Jazaretการตอบสนอง แต่ไม่ขยายต้นแบบ: การใช้ฟังก์ชั่นธรรมดา ( ทำไมมีการขยายวัตถุพื้นเมืองของการปฏิบัติที่ไม่ดี? ):

function isLeapYear(year) { 
    return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)); 
}

function getDaysInMonth(year, month) {
    return [31, (isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
}

function addMonths(date, value) {
    var d = new Date(date),
        n = date.getDate();
    d.setDate(1);
    d.setMonth(d.getMonth() + value);
    d.setDate(Math.min(n, getDaysInMonth(d.getFullYear(), d.getMonth())));
    return d;
}

ใช้มัน:

var nextMonth = addMonths(new Date(), 1);

4

จากคำตอบข้างต้นมีเพียงกรณีเดียวที่จัดการกับเคสขอบ (bmpasini จากไลบรารี datejs) มีปัญหา:

var date = new Date("03/31/2015");
var newDate = date.addMonths(1);
console.log(newDate);
// VM223:4 Thu Apr 30 2015 00:00:00 GMT+0200 (CEST)

ได้. แต่:

newDate.toISOString()
//"2015-04-29T22:00:00.000Z"

แย่ลง:

var date = new Date("01/01/2015");
var newDate = date.addMonths(3);
console.log(newDate);
//VM208:4 Wed Apr 01 2015 00:00:00 GMT+0200 (CEST)
newDate.toISOString()
//"2015-03-31T22:00:00.000Z"

นี่เป็นเพราะเวลาที่ไม่ได้ตั้งค่าจึงเปลี่ยนกลับเป็น 00:00:00 ซึ่งสามารถผิดพลาดไปเมื่อวันก่อนเนื่องจากการเปลี่ยนแปลงเขตเวลาหรือการประหยัดเวลาหรืออะไรก็ตาม ...

นี่คือวิธีแก้ไขปัญหาที่เสนอของฉันซึ่งไม่ได้มีปัญหานั้นและฉันก็คิดว่าสง่างามยิ่งกว่าในเรื่องที่ไม่ต้องพึ่งพาค่าตายตัว

/**
* @param isoDate {string} in ISO 8601 format e.g. 2015-12-31
* @param numberMonths {number} e.g. 1, 2, 3...
* @returns {string} in ISO 8601 format e.g. 2015-12-31
*/
function addMonths (isoDate, numberMonths) {
    var dateObject = new Date(isoDate),
        day = dateObject.getDate(); // returns day of the month number

    // avoid date calculation errors
    dateObject.setHours(20);

    // add months and set date to last day of the correct month
    dateObject.setMonth(dateObject.getMonth() + numberMonths + 1, 0);

    // set day number to min of either the original one or last day of month
    dateObject.setDate(Math.min(day, dateObject.getDate()));

    return dateObject.toISOString().split('T')[0];
};

หน่วยทดสอบสำเร็จด้วย:

function assertEqual(a,b) {
    return a === b;
}
console.log(
    assertEqual(addMonths('2015-01-01', 1), '2015-02-01'),
    assertEqual(addMonths('2015-01-01', 2), '2015-03-01'),
    assertEqual(addMonths('2015-01-01', 3), '2015-04-01'),
    assertEqual(addMonths('2015-01-01', 4), '2015-05-01'),
    assertEqual(addMonths('2015-01-15', 1), '2015-02-15'),
    assertEqual(addMonths('2015-01-31', 1), '2015-02-28'),
    assertEqual(addMonths('2016-01-31', 1), '2016-02-29'),
    assertEqual(addMonths('2015-01-01', 11), '2015-12-01'),
    assertEqual(addMonths('2015-01-01', 12), '2016-01-01'),
    assertEqual(addMonths('2015-01-01', 24), '2017-01-01'),
    assertEqual(addMonths('2015-02-28', 12), '2016-02-28'),
    assertEqual(addMonths('2015-03-01', 12), '2016-03-01'),
    assertEqual(addMonths('2016-02-29', 12), '2017-02-28')
);

3

ตามที่คำตอบส่วนใหญ่เน้นไว้เราสามารถใช้เมธอดsetMonth ()ร่วมกับเมธอด getMonth ()เพื่อเพิ่มจำนวนเดือนที่เฉพาะเจาะจงลงในวันที่ที่กำหนด

ตัวอย่าง: (ตามที่ @ChadD พูดถึงในคำตอบของเขา)

var x = 12; //or whatever offset 
var CurrentDate = new Date();
CurrentDate.setMonth(CurrentDate.getMonth() + x);

แต่เราควรใช้วิธีแก้ปัญหานี้อย่างระมัดระวังเพราะเราจะมีปัญหากับเคสแบบขอบ

เพื่อจัดการกรณีขอบคำตอบที่ได้รับในลิงค์ต่อไปนี้จะเป็นประโยชน์

https://stackoverflow.com/a/13633692/3668866


3

วิธีแก้ปัญหาง่ายๆ2678400000คือ 31 วันในหน่วยมิลลิวินาที

var oneMonthFromNow = new Date((+new Date) + 2678400000);

ปรับปรุง:

ใช้ข้อมูลนี้เพื่อสร้างฟังก์ชั่นของเรา:

  • 2678400000 - 31 วัน
  • 2592000000 - 30 วัน
  • 2505600000 - 29 วัน
  • 2419200000 - 28 วัน

8
บางเดือนไม่มี 31 วัน
Alexandru Severin

เห็นด้วย แต่คุณสามารถปรับหรือเขียนฟังก์ชั่นได้อย่างง่ายดาย
dr.dimitru

2
ฉันเดาว่าสิ่งที่ผู้คนกำลังมองหาคือฟังก์ชั่นที่ดีมากซึ่งโดยอัตโนมัติจะพิจารณาวันในเดือน
Alexander Bird

@AlexanderBird จากนั้นใช้เครื่องมือกันกระสุนที่สร้างโดยคนอื่นเช่น moment.js
dr.dimitru

2
คำตอบนี้ไม่รองรับการปรับเวลาตามฤดูกาลซึ่งไม่ใช่ทุกวันเป็น 24 ชั่วโมง (หรือ 8.64e7 มิลลิวินาที)
RobG

2
d = new Date();

alert(d.getMonth()+1);

เดือนมีดัชนีตาม 0 ควรแจ้งเตือน (4) ซึ่งคือ 5 (อาจ);


วิธีนี้สามารถส่งคืนค่า <0 และมากกว่า 12
Patrick

2

เพียงเพิ่มคำตอบที่ได้รับการยอมรับและความคิดเห็น

var x = 12; //or whatever offset
var CurrentDate = new Date();

//For the very rare cases like the end of a month
//eg. May 30th - 3 months will give you March instead of February
var date = CurrentDate.getDate();
CurrentDate.setDate(1);
CurrentDate.setMonth(CurrentDate.getMonth()+X);
CurrentDate.setDate(date);

2
เมื่อคุณตั้งค่าวันที่ (31) เป็น "1 กุมภาพันธ์" คุณจะได้รับ "3 มีนาคม" มันเป็นสิ่งที่คุณต้องการจริงๆเหรอ?
Antony Hatchkins

2

ฉันเขียนโซลูชันทางเลือกนี้ซึ่งใช้ได้กับฉัน มันจะมีประโยชน์เมื่อคุณต้องการคำนวณการสิ้นสุดของสัญญา ตัวอย่างเช่น start = 2016-01-15, เดือน = 6, end = 2016-7-14 (เช่นวันสุดท้าย - 1):

<script>
function daysInMonth(year, month)
{
    return new Date(year, month + 1, 0).getDate();
}

function addMonths(date, months)
{
    var target_month = date.getMonth() + months;
    var year = date.getFullYear() + parseInt(target_month / 12);
    var month = target_month % 12;
    var day = date.getDate();
    var last_day = daysInMonth(year, month);
    if (day > last_day)
    {
        day = last_day;
    }
    var new_date = new Date(year, month, day);
    return new_date;
}

var endDate = addMonths(startDate, months);
</script>

ตัวอย่าง:

addMonths(new Date("2016-01-01"), 1); // 2016-01-31
addMonths(new Date("2016-01-01"), 2); // 2016-02-29 (2016 is a leap year)
addMonths(new Date("2016-01-01"), 13); // 2017-01-31
addMonths(new Date("2016-01-01"), 14); // 2017-02-28

0

ต่อไปนี้เป็นตัวอย่างของวิธีการคำนวณวันที่ในอนาคตโดยยึดตามการป้อนวันที่ (Membershipssignup_date) + เดือนที่เพิ่ม (Membershipsmonths) ผ่านเขตข้อมูลฟอร์ม

ฟิลด์ Membershipsmonths มีค่าเริ่มต้นเป็น 0

ลิงก์ทริกเกอร์ (สามารถเป็นเหตุการณ์ onchange ที่แนบกับฟิลด์คำสมาชิก):

<a href="#" onclick="calculateMshipExp()"; return false;">Calculate Expiry Date</a>

function calculateMshipExp() {

var calcval = null;

var start_date = document.getElementById("membershipssignup_date").value;
var term = document.getElementById("membershipsmonths").value;  // Is text value

var set_start = start_date.split('/');  

var day = set_start[0];  
var month = (set_start[1] - 1);  // January is 0 so August (8th month) is 7
var year = set_start[2];
var datetime = new Date(year, month, day);
var newmonth = (month + parseInt(term));  // Must convert term to integer
var newdate = datetime.setMonth(newmonth);

newdate = new Date(newdate);
//alert(newdate);

day = newdate.getDate();
month = newdate.getMonth() + 1;
year = newdate.getFullYear();

// This is British date format. See below for US.
calcval = (((day <= 9) ? "0" + day : day) + "/" + ((month <= 9) ? "0" + month : month) + "/" + year);

// mm/dd/yyyy
calcval = (((month <= 9) ? "0" + month : month) + "/" + ((day <= 9) ? "0" + day : day) + "/" + year);

// Displays the new date in a <span id="memexp">[Date]</span> // Note: Must contain a value to replace eg. [Date]
document.getElementById("memexp").firstChild.data = calcval;

// Stores the new date in a <input type="hidden" id="membershipsexpiry_date" value="" name="membershipsexpiry_date"> for submission to database table
document.getElementById("membershipsexpiry_date").value = calcval;
}

0

ดังที่แสดงโดยคำตอบที่ซับซ้อนและน่าเกลียดมากมายที่นำเสนอวันที่และเวลาอาจเป็นฝันร้ายสำหรับโปรแกรมเมอร์ที่ใช้ภาษาใด ๆ แนวทางของฉันคือการแปลงวันที่และค่า 'เดลต้า t' เป็น Epoch Time (เป็นมิลลิวินาที) ทำการคำนวณทางคณิตศาสตร์ใด ๆ จากนั้นแปลงกลับเป็น "เวลาของมนุษย์"

// Given a number of days, return a Date object
//   that many days in the future. 
function getFutureDate( days ) {

    // Convert 'days' to milliseconds
    var millies = 1000 * 60 * 60 * 24 * days;

    // Get the current date/time
    var todaysDate = new Date();

    // Get 'todaysDate' as Epoch Time, then add 'days' number of mSecs to it
    var futureMillies = todaysDate.getTime() + millies;

    // Use the Epoch time of the targeted future date to create
    //   a new Date object, and then return it.
    return new Date( futureMillies );
}

// Use case: get a Date that's 60 days from now.
var twoMonthsOut = getFutureDate( 60 );

สิ่งนี้เขียนขึ้นสำหรับกรณีการใช้งานที่แตกต่างกันเล็กน้อย แต่คุณควรสามารถปรับให้เข้ากับงานที่เกี่ยวข้องได้อย่างง่ายดาย

แก้ไข: แหล่งข้อมูลเต็มรูปแบบที่นี่ !


3
คำตอบที่ไร้ประโยชน์เพราะมันไม่ได้จัดการกับเดือนด้วยจำนวนวันที่แตกต่างกันซึ่งเป็นคำถาม
Benubird

1
@Benubird - เมื่อคุณถามอย่างสุภาพฉันได้อัพโหลดแหล่งข้อมูลเต็มรูปแบบแล้ว ลิงก์ในโพสต์นี้
Dan Ahlquist

สิ่งนี้ยังไม่รองรับการปรับเวลาตามฤดูกาลซึ่งไม่ใช่ทุกวันที่มี 24 ชั่วโมง (หรือ 8.64e7 มิลลิวินาที) ที่มีความยาว
RobG

ไม่เลย DST เป็นข้อกังวลเกี่ยวกับการแปล
Dan Ahlquist

0

ทั้งหมดนี้ดูเหมือนจะซับซ้อนเกินไปและฉันคิดว่ามันจะเป็นการอภิปรายเกี่ยวกับความหมายของ "เดือน" หมายความว่า 30 วันหรือไม่ หมายความว่าตั้งแต่วันที่ 1 ถึงวันที่ 1 หรือไม่? จากวันสุดท้ายจนถึงวันสุดท้ายหรือไม่

หากหลังจากนั้นการเพิ่มเดือนไปยัง 27 กุมภาพันธ์นำคุณไปสู่ ​​27 มีนาคม แต่การเพิ่มเดือนถึง 28 กุมภาพันธ์จะนำคุณไปสู่วันที่ 31 มีนาคม (ยกเว้นในปีอธิกสุรทินที่ทำให้คุณถึง 28 มีนาคม) จากนั้นลบหนึ่งเดือนนับจากวันที่ 30 มีนาคมคุณ ... 27 ก.พ. ใครจะรู้...

สำหรับผู้ที่กำลังมองหาทางออกที่ง่ายเพียงแค่เพิ่มมิลลิวินาทีและทำได้

function getDatePlusDays(dt, days) {
  return new Date(dt.getTime() + (days * 86400000));
}

หรือ

Date.prototype.addDays = function(days) {
  this = new Date(this.getTime() + (days * 86400000));
};

ฉันรู้สึกว่ามันชัดเจนว่า "การเพิ่ม X เดือน" หมายถึงเดือนที่เพิ่มขึ้นโดย X มันเป็นความจริงที่คำตอบของคุณมีขั้นตอนอัลกอริทึมน้อยลงในการเขียนโค้ด แต่น่าเสียดายที่ฉันรู้สึกว่าความแม่นยำนั้นง่ายกว่า เมื่อผู้คนมองหาคำตอบพวกเขาจะต้องการ '31 กรกฎาคม 2016' ให้กลายเป็น 'Augest 31 2016' และนี่จะไม่ทำเช่นนั้น นอกจากนี้หากคุณต้องการความเรียบง่ายในราคาที่ถูกต้องทำไมไม่ยึดติดกับd.setMonth(d.getMonth()+1)อะไร ดังนั้นนี่ไม่ใช่ความคิดที่ง่ายที่สุด
Alexander Bird

สิ่งนี้ยังไม่รองรับการปรับเวลาตามฤดูกาลซึ่งไม่ใช่ทุกวันที่มี 24 ชั่วโมง (หรือ 8.64e7 มิลลิวินาที) ที่มีความยาว
RobG

-1
addDateMonate : function( pDatum, pAnzahlMonate )
{
    if ( pDatum === undefined )
    {
        return undefined;
    }

    if ( pAnzahlMonate === undefined )
    {
        return pDatum;
    }

    var vv = new Date();

    var jahr = pDatum.getFullYear();
    var monat = pDatum.getMonth() + 1;
    var tag = pDatum.getDate();

    var add_monate_total = Math.abs( Number( pAnzahlMonate ) );

    var add_jahre = Number( Math.floor( add_monate_total / 12.0 ) );
    var add_monate_rest = Number( add_monate_total - ( add_jahre * 12.0 ) );

    if ( Number( pAnzahlMonate ) > 0 )
    {
        jahr += add_jahre;
        monat += add_monate_rest;

        if ( monat > 12 )
        {
            jahr += 1;
            monat -= 12;
        }
    }
    else if ( Number( pAnzahlMonate ) < 0 )
    {
        jahr -= add_jahre;
        monat -= add_monate_rest;

        if ( monat <= 0 )
        {
            jahr = jahr - 1;
            monat = 12 + monat;
        }
    }

    if ( ( Number( monat ) === 2 ) && ( Number( tag ) === 29 ) )
    {
        if ( ( ( Number( jahr ) % 400 ) === 0 ) || ( ( Number( jahr ) % 100 ) > 0 ) && ( ( Number( jahr ) % 4 ) === 0 ) )
        {
            tag = 29;
        }
        else
        {
            tag = 28;
        }
    }

    return new Date( jahr, monat - 1, tag );
}


testAddMonate : function( pDatum , pAnzahlMonate )
{
    var datum_js = fkDatum.getDateAusTTMMJJJJ( pDatum );
    var ergebnis = fkDatum.addDateMonate( datum_js, pAnzahlMonate );

    app.log( "addDateMonate( \"" + pDatum + "\", " + pAnzahlMonate + " ) = \"" + fkDatum.getStringAusDate( ergebnis ) + "\"" );
},


test1 : function()
{
    app.testAddMonate( "15.06.2010",    10 );
    app.testAddMonate( "15.06.2010",   -10 );
    app.testAddMonate( "15.06.2010",    37 );
    app.testAddMonate( "15.06.2010",   -37 );
    app.testAddMonate( "15.06.2010",  1234 );
    app.testAddMonate( "15.06.2010", -1234 );
    app.testAddMonate( "15.06.2010",  5620 );
    app.testAddMonate( "15.06.2010", -5120 );

}

1
ฉันพบว่ามัน verwirrend มากเมื่อส่วนใหญ่ของรหัส ist ในภาษาอังกฤษและตัวแปรใน Deutsch ;)
Bernhard Hofmann

-1

บางครั้งสร้างวันที่มีประโยชน์โดยหนึ่งโอเปอเรเตอร์เช่นในพารามิเตอร์ BIRT

ฉันย้อนกลับไป 1 เดือนด้วย:

new Date(new Date().setMonth(new Date().getMonth()-1));   

-3
var a=new Date();
a.setDate(a.getDate()+5);

ตามวิธีที่ระบุไว้ข้างต้นคุณสามารถเพิ่มเดือนในการDateทำงาน

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