เพิ่มวันในวันที่จาวาสคริปต์


1094

วิธีเพิ่มวันเป็นปัจจุบันDateโดยใช้ JavaScript JavaScript มีฟังก์ชันในตัวเช่น. Net AddDayหรือไม่

คำตอบ:


1209

คุณสามารถสร้างขึ้นด้วย: -

Date.prototype.addDays = function(days) {
    var date = new Date(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
}

var date = new Date();

alert(date.addDays(5));

การดำเนินการนี้จะเพิ่มเดือนโดยอัตโนมัติหากจำเป็น ตัวอย่างเช่น:

8/31 + 1 วันที่จะกลายเป็น9/1

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


17
แบบง่าย:Date.prototype.addDays=function(d){return new Date(this.valueOf()+864E5*d);};
Duncan

27
@ ดันแคนคุณแน่ใจหรือว่านี่เป็นสิ่งเดียวกันกับข้างบน? หนึ่งนี้เป็นเพียงการเพิ่ม 24 ชั่วโมง แต่วันหนึ่งไม่ได้เสมอตลอด 24 ชั่วโมง ฉันเดาว่าคำถามคือวิธีการเพิ่มส่วนวันโดย 1 วันโดยไม่เปลี่ยนส่วนเวลา
TamásBolvári

88
864E5ด้วยเหตุผลบางอย่างที่ฉันชอบที่จะเขียน24*60*60ในรหัสของฉัน :)
ดาวอังคารโรเบิร์ต

62
ผู้ชายอย่าใช้วิธีการเพิ่ม 864E5 เพราะนี่ไม่ได้ใช้ความแตกต่างในการปรับเวลาตามฤดูกาลซึ่งอาจเป็น 23 หรือ 25 ชั่วโมง
sbrbot

12
สำหรับคนที่คุณกังวลเกี่ยวกับการออมตามฤดูกาล - ไม่ต้อง อัลกอริธึมเหล่านี้เปลี่ยนวันที่พื้นฐานไม่ใช่การตีความวันที่ มีการใช้งาน DST ในตัวเชื่อมต่อและตัวตั้งค่าของวันที่ - ตัวเชื่อมโยงเพื่อลบหนึ่งชั่วโมงในฤดูร้อนและตัวตั้งค่าเพื่อเพิ่มชั่วโมงนั้นกลับในช่วงฤดูร้อนเพื่อทำให้เวลาเป็นปกติ แต่เฉพาะเมื่อใช้ชั่วโมงแน่นอน - ชั่วโมงญาติไม่จำเป็นต้องตีความ นี่คือเหตุผลที่วันที่คณิตศาสตร์ทำงาน IMHO ...
เจอราร์ดโอนีล

755

คำตอบที่ถูกต้อง :

function addDays(date, days) {
  var result = new Date(date);
  result.setDate(result.getDate() + days);
  return result;
}

คำตอบที่ไม่ถูกต้อง :

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

// Don't do it this way!
function addDaysWRONG(date, days) {
  var result = new Date();
  result.setDate(date.getDate() + days);
  return result;
}

หลักฐาน / ตัวอย่าง

ตรวจสอบ JsFiddle นี้


@bzlm ใช่เป็นหลักเดียวกัน มันไม่ได้แก้ไขต้นแบบวันที่ ฉันต้องการชี้จุดบกพร่องในคำตอบหลักด้วย
Sparebytes

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

7
@bzlm: ใช่ฉันเชื่อว่าโน้ตควรอ่าน "วิธีการนี้ล้มเหลวหากวันที่ 'จาก' ไม่อยู่ในปีหรือเดือนเดียวกับวันที่ปัจจุบัน " ฉันยังคงกังวลว่าผู้ใช้จะได้รับคำตอบมากกว่าและไม่อ่านคำเตือนเนื่องจากไม่โดดเด่น ขอบคุณ
Sparebytes

3
ฉันคิดว่าแม้ว่างานนี้จะไม่ถูกต้อง ไม่มีตัวสร้างดังกล่าวสำหรับวันที่: var result = new Date (date); ดูhttp://www.w3schools.com/js/js_dates.asp แม้ว่าโดยปกติจะใช้งานได้บางครั้งอาจทำให้เกิดผลลัพธ์ที่ไม่ถูกต้องเนื่องจากการแปลงเป็นสตริงและในทางกลับกัน ควรเป็นผลลัพธ์ var = new Date (date.getTime ());
Marcin

2
@AnkitBalyan ดูคำตอบอื่น ๆ มันอาจทำงานไม่ถูกต้องเนื่องจากประหยัดเวลากลางวัน
ว่าง

188
var today = new Date();
var tomorrow = new Date();
tomorrow.setDate(today.getDate()+1);

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


1
ใช่? แต่นี่คืออะไร (วิ่งในวันที่ 31 มีนาคม 2010): วันนี้ = วันที่ใหม่ (); พรุ่งนี้ = วันที่ใหม่ (); tomorrow.setDate (today.getDate () + 1); การแจ้งเตือน (tomorrow.getMonth ()); พูดว่า "3" การแจ้งเตือน (วันพรุ่งนี้); ถูกต้อง ... ทำไม ???
d -_- b

12
@sims เดือนเป็นดัชนี 0 เดือนที่ 3 คือเดือนเมษายน
Joel Coehoorn

6
ทำไมต้องสร้างวัตถุวันที่ 2 แบบแยกกัน? ทำไมไม่เพียงแค่ใช้วัตถุวันเดียวกันvar d = new Date(); d.setDate( d.getDate() + 1 );?
Joseph Silber

8
วิธีนี้ใช้ไม่ได้ผลในหลายปี หากวันที่เริ่มต้นของคุณมาจากไม่กี่ปีที่ผ่านมาgetDate()ส่งคืนวันที่ของปีนั้น จากนั้นเรียกsetDateชุดในวันที่ปีปัจจุบัน ดังนั้นจึงไม่ใช่คำตอบทั่วไปที่ดี คำตอบของ @ AnthonyWJonesทำงานได้จริงอย่างถูกต้อง
Drew Noakes

3
@ DrewNoakes - การยืนยันของคุณว่ามันไม่ได้ผลในช่วงหลายปีที่ไม่ถูกต้อง getDateส่งคืนวันในเดือนไม่ใช่ "วันของปีนั้น" เช่นvar d = new Date(2015,11,30);d.setDate(d.getDate() + 370)ให้ 3 มกราคม 2017 ซึ่งข้าม 2 ปี
RobG

124

ทางออกที่ง่ายของฉันคือ:

nextday=new Date(oldDate.getFullYear(),oldDate.getMonth(),oldDate.getDate()+1);

วิธีนี้ไม่ได้มีปัญหากับการปรับเวลาตามฤดูกาล นอกจากนี้หนึ่งสามารถเพิ่ม / ย่อยชดเชยใด ๆ สำหรับปีเดือนวัน ฯลฯ

day=new Date(oldDate.getFullYear()-2,oldDate.getMonth()+22,oldDate.getDate()+61);

เป็นรหัสที่ถูกต้อง


13
หมายเหตุ: เวลานี้จะรีเซ็ตเป็น 00:00:00 (อาจเป็นปัญหาหรือไม่ก็ตาม)
ÁlvaroGonzález

ไม่ทำงานในวันสุดท้ายของเดือนใด ๆ ตามที่คุณพูด ทำให้สิ่งนี้ใช้ไม่ได้ใน 12 วันของปี ฟังดูเหมือนฝันร้ายที่จะดีบัก !!!
Drew Noakes

6
ไม่ดึงข้อมูลใช้งานได้ทุกวัน คุณสามารถกำหนดให้อ็อฟเซ็ตวันที่ใหญ่กว่า 31 หรือออฟเซ็ตใหญ่กว่า 12 และฟังก์ชั่นนี้จะคำนวณใหม่เป็นวันในเดือนถัดไปหรือเดือนถัดไปในปีถัดไป ตัวอย่างเช่น: nextday = new Date (oldDate.getFullYear (), oldDate.getMonth (), oldDate.getDate () + 40); เป็นรหัสที่ดีอย่างสมบูรณ์
sbrbot

มี getMonth () +22 - คุณคิดว่ามันจะใช้งานได้ยังไง!?
sbrbot

1
ฉันเห็นด้วยใช้วิธีนี้ setDateเราก็มีข้อผิดพลาดเพราะเวลาออมแสงเพราะเราได้ใช้
Jelle

95

คำตอบเหล่านี้ดูเหมือนจะทำให้ฉันสับสนฉันชอบ:

var ms = new Date().getTime() + 86400000;
var tomorrow = new Date(ms);

getTime () ให้มิลลิวินาทีแก่เราตั้งแต่ปี 1970 และ 86400000 คือจำนวนมิลลิวินาทีในหนึ่งวัน ดังนั้น ms จึงมีมิลลิวินาทีสำหรับวันที่ต้องการ

การใช้ตัวสร้างมิลลิวินาทีให้วัตถุวันที่ที่ต้องการ


46
โซลูชันนี้ไม่ได้คำนึงถึงการประหยัดเวลากลางวัน ตัวอย่างเช่นนี้จะส่งคืนในวันเดียวกัน 23 ชั่วโมงต่อมา: new Date(new Date('11/4/2012').getTime() + 86400000)
โนอาห์แฮร์ริสัน

6
@NahahMiller ปัญหาที่คุณพบอาจเป็นคุณลักษณะที่ไม่ใช่ข้อผิดพลาด! บางครั้งการเพิ่ม 24 ชั่วโมงต่อวันเป็นสิ่งที่ถูกต้องที่ต้องทำโดยมีเป้าหมายเพื่อทราบเวลาที่เกิดขึ้นตาม DST วันที่ตัวอย่างของคุณส่งคืนมีค่าเวลา 23.00 น. ของวันที่ 4 พฤศจิกายนซึ่งเป็น 24 ชั่วโมงหลังจากนั้นในวันนั้น โปสเตอร์ต้นฉบับถามเกี่ยวกับวันที่และเวลาซึ่งดูเหมือนจะบ่งบอกถึงความต้องการในช่วงเวลาที่ถูกต้องของวัน คำตอบนี้ถูกต้องหากคุณเป็นในกรณีที่เป้าหมายของคุณคือเวลา 24 ชั่วโมงในภายหลัง
Andy Novocin

3
ฉันเห็นด้วยกับโนอาห์ var d2 = วันที่ใหม่ (d1.valueOf () + 24 * 60 * 60 * 1,000) ทำสิ่งที่มันพูดเพิ่มวันเต็มมูลค่าติ๊กในวันที่
Corey Alix

6
สิ่งนี้ถูกต้องอย่างแน่นอนสำหรับบางกรณี (เช่นคุกกี้ 1 วัน) และวิธีแก้ปัญหาที่ง่ายกว่าส่วนใหญ่ ฉันไม่เข้าใจว่าทำไมมันถึงมี downvotes มากมายและ upvotes น้อยมาก: /
Matmarbon

48

ลอง

var someDate = new Date();
var duration = 2; //In Days
someDate.setTime(someDate.getTime() +  (duration * 24 * 60 * 60 * 1000));

ใช้ setDate () เพื่อเพิ่มวันที่จะไม่แก้ปัญหาของคุณลองเพิ่มบางวันในเดือนกุมภาพันธ์หากคุณพยายามที่จะเพิ่มวันใหม่มันจะไม่ส่งผลในสิ่งที่คุณคาดหวัง


26
ไม่ไม่ควรทำเครื่องหมายเป็นคำตอบที่ถูกต้องเนื่องจากวิธีแก้ปัญหานี้ถือว่าทุกวันมี 24 * 60 * 60 * 1,000 วินาที แต่มันไม่ได้ (ประหยัดเวลากลางวัน)!
sbrbot

มีหลักฐานเกี่ยวกับปัญหา 'ก.พ. ' ด้วยsetDate()หรือไม่ เป็นอย่างนี้หรือไม่: stackoverflow.com/questions/5497637/…
nobar

9
+1 ควรทำเครื่องหมายเป็นคำตอบที่ถูกต้อง ฉันเชื่อว่า "การปรับเวลาตามฤดูกาล" เป็นเรื่องของการนำเสนอไม่ใช่เกี่ยวกับคุณค่าซึ่งเป็นเพียงจำนวนมิลลิวินาที จากค่า - มุมมอง - วันคือจำนวน CONST ของมิลลิวินาทีในขณะที่การนำเสนออาจแตกต่างกันไป
ตัดสิทธิ์เมื่อ

1
@ disfated - นี่ไม่ใช่คำตอบที่ถูกต้อง วันที่ออกจากการบันทึกเวลากลางวันมี 25 ชั่วโมง แต่วิธีนี้เพิ่มเพียง 24 ดังนั้นวันที่จะเหมือนกัน การใช้ 24 ชั่วโมงเพื่อเป็นตัวแทนวันทำงานหากใช้วิธีการ UTC แทน แต่ทำไมต้องกังวลเมื่อใช้setDateจะสะดวกกว่า ;-)
RobG

38

ใช้เวลานานแค่ไหนในการพยายามหาข้อตกลงกับปีที่ไม่ได้เพิ่มเมื่อทำตามตัวอย่างนำด้านล่าง

หากคุณต้องการเพียงแค่เพิ่ม n วันในวันที่คุณมีคุณที่ดีที่สุดที่จะไป:

myDate.setDate (myDate.getDate () + n);

หรือรุ่นที่มีลมพัดยาว

var theDate = new Date(2013, 11, 15);
var myNewDate = new Date(theDate);
myNewDate.setDate(myNewDate.getDate() + 30);
console.log(myNewDate);

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


7
อ่านคำตอบทั้งหมดรอบ ๆ จนกว่าฉันจะพบอัญมณีนี้ ตอนนี้ที่เหมาะสม น่าแปลกใจที่สิ่งที่วันนี้ / วันพรุ่งนี้ถูกคัดลอกมาจากคำตอบเกือบทั้งหมดเมื่อมันไม่สมเหตุสมผลเลยและมันก็ไม่ใช่ "สำหรับการอ่านและความชัดเจน" ตามที่ผู้เขียนกล่าวไว้ในคำตอบ upvoted ที่สุด - ในความคิดเห็นที่ upvoted ที่สุด - มันสับสนและเป็นการฝึกฝนที่ไม่ถูกต้อง
Cesc

23

หากคุณสามารถใช้moment.js JavaScript ไม่มีวิธีวัน / เวลาดั้งเดิมที่ดีมาก ต่อไปนี้เป็นตัวอย่างของไวยากรณ์ Moment:

var nextWeek = moment().add(7, 'days');
alert(nextWeek);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>

การอ้างอิง: http://momentjs.com/docs/#/manipulating/add/


1
@ kpull1 ผู้ถามไม่ได้ จำกัด โดเมนโซลูชันโดยถามว่ามีวิธีแก้ปัญหาในตัวหรือไม่
user2910265

4
บันทึกย่อที่ทันสมัย: Moment.js หนักอย่างไม่น่าเชื่อที่จะเพิ่มสำหรับวัตถุประสงค์ขนาดเล็กเช่นนี้ มีหลายร้อย KB และไม่เหมาะสำหรับเว็บแพคกล่อง
Joshua Comeau

1
ห้องสมุดที่เราต้องการคือ date-fns เป็นมิตรกับเว็บแพครวดเร็วและถือว่าวันที่ไม่เปลี่ยนรูป
Freewalker

1
@ ลุควิลเลียมส์ไม่เคยได้ยินเรื่องเดท - จนถึงตอนนี้ จะตรวจสอบมัน ขอบคุณ
user2910265

2
@JoshuaComeau หากคุณดาวน์โหลดจากcdnjs.cloudflare.com/ajax/libs/moment.js/2.19.3/moment.min.jsมันใช้เวลา 53,248 ไบต์บนดิสก์ ฉันจินตนาการว่ามันเป็นขี้ผึ้งทั้งหมด แต่ฉันไม่รู้ อย่างไรก็ตามอะไรก็ตาม มันไม่ใช่เรื่องใหญ่
birdus

22
int days = 1;
var newDate = new Date(Date.now() + days * 24*60*60*1000);

CodePen

var days = 2;
var newDate = new Date(Date.now() + days * 24*60*60*1000);

document.write('Today: <em>');
document.write(new Date());
document.write('</em><br/> New: <strong>');
document.write(newDate);


2
โหวตขึ้นเนื่องจากไม่ต้องการตัวแปรวันที่ระดับกลาง
Jeff Lowery

นี่เป็นคำตอบที่ดีที่สุดเพราะไม่มีการกลายพันธุ์
knocte

ไม่ใช่ทุกวันมี 24 ชั่วโมงมันล้มเหลวเป็นเวลา DST และกระโดดวินาที
เตฟาน

19

ฉันสร้างส่วนขยายเหล่านี้เมื่อคืน:
คุณสามารถส่งผ่านค่าบวกหรือค่าลบ

ตัวอย่าง:

var someDate = new Date();
var expirationDate = someDate.addDays(10);
var previous = someDate.addDays(-5);


Date.prototype.addDays = function (num) {
    var value = this.valueOf();
    value += 86400000 * num;
    return new Date(value);
}

Date.prototype.addSeconds = function (num) {
    var value = this.valueOf();
    value += 1000 * num;
    return new Date(value);
}

Date.prototype.addMinutes = function (num) {
    var value = this.valueOf();
    value += 60000 * num;
    return new Date(value);
}

Date.prototype.addHours = function (num) {
    var value = this.valueOf();
    value += 3600000 * num;
    return new Date(value);
}

Date.prototype.addMonths = function (num) {
    var value = new Date(this.valueOf());

    var mo = this.getMonth();
    var yr = this.getYear();

    mo = (mo + num) % 12;
    if (0 > mo) {
        yr += (this.getMonth() + num - mo - 12) / 12;
        mo += 12;
    }
    else
        yr += ((this.getMonth() + num - mo) / 12);

    value.setMonth(mo);
    value.setYear(yr);
    return value;
}

7
วิธีการ. addDays () ไม่ทำงานสำหรับวันที่ที่ข้ามขอบเขตการปรับเวลาตามฤดูกาล
mskfisher

1
นี่เป็นหนึ่งในคำตอบที่ดีกว่าที่นี่เพราะคุณ (ถูกต้อง) ใช้จำนวนมิลลิวินาทีตั้งแต่ epoc เพื่อแสดงวันที่ / เวลาและเพิ่มจำนวนของมิลลิวินาทีสำหรับการปรับ ... ทำไมคุณไม่เก็บข้อมูลนี้ไว้เป็น "addMonths"! ? และทำไมไม่มีปีเพิ่ม คุณเบื่อไหม
Robin

นอกจากเดือนสามารถแสดงช่วงเวลาด้วยตัวเลขคงที่ แต่เดือนสามารถมีความยาวได้สี่แบบ นอกจากนี้ความยาวของช่วงเวลาตั้งแต่วันขึ้นไปอาจมีความยาวผันแปรได้ที่ DST ดังนั้นคุณจึงไม่สามารถใช้การเพิ่มตามเวลาได้อีกต่อไปหากไม่มีความซับซ้อนอีกระดับ ฉันเพิ่ม addYears () และฉันแก้ไข addMonths ()
Suamere

14

โดยไม่ใช้ตัวแปรตัวที่สองคุณสามารถแทนที่ 7 ด้วย x วันถัดไปของคุณ:

let d=new Date(new Date().getTime() + (7 * 24 * 60 * 60 * 1000));

14

ถึง substract ใช้งาน30วัน (24 ชม. = 86400000 มิลลิวินาที)

new Date(+yourDate - 30 *86400000)


เมื่อพยายามคำนวณเวลาวันที่ให้จำวันเวลานั้นเสมอโดยอิงตามมิลลิวินาทีในสาขาวิทยาศาสตร์คอมพิวเตอร์ ( en.wikipedia.org/wiki/System_time#Retrieving_system_time ) วันที่ใหม่ (+ yourDate + 30 * (24 * 60 * 60 * 1000)
Ashraf Abusada

13

ทางออกที่ง่ายที่สุด

 Date.prototype.addDays = function(days) {
   this.setDate(this.getDate() + parseInt(days));
   return this;
 };

 // and then call

 var newDate = new Date().addDays(2); //+2 days
 console.log(newDate);

 // or

 var newDate1 = new Date().addDays(-2); //-2 days
 console.log(newDate1);


ฉันคิดว่านี่เป็นทางออกที่ดีที่สุด หากเรากำลังขยายคลาส Date มันจะเป็นการดีกว่าที่อินสแตนซ์ Date จะอัปเดตตัวเอง
Porlune

10

ขอบคุณ Jason สำหรับคำตอบของคุณที่ได้ผลตามที่คาดหวังนี่คือการผสมผสานจากโค้ดของคุณและรูปแบบที่สะดวกของ AnthonyWJones:

Date.prototype.addDays = function(days){
    var ms = new Date().getTime() + (86400000 * days);
    var added = new Date(ms);
    return added;
}

6
มันไม่ได้คำนึงถึงการประหยัดเวลากลางวันเมื่อมีมากกว่าหรือน้อยกว่า 86400000 วินาทีต่อวันและอาจส่งผลให้เกิดข้อผิดพลาดเชิงตรรกะ (ข้อผิดพลาดของโปรแกรม) ในรหัสของคุณ
sbrbot

บางครั้งก็จำเป็น eBay API มีการประมูลแบบ x-day ซึ่งใช้เวลา 24 ชั่วโมงดังนั้นรายการของคุณจะสิ้นสุดในเวลาที่แตกต่างจากที่เกิดขึ้นหากสถานะ DST เปลี่ยนไปกลางการประมูล ในกรณีนี้คุณต้องใช้ฟังก์ชันประเภทนี้เพื่อหลีกเลี่ยงข้อผิดพลาดเชิงตรรกะ
Andy Novocin

10

สายงานปาร์ตี้แต่ถ้าคุณใช้jQueryแล้วมีปลั๊กอินที่ยอดเยี่ยมที่เรียกว่าช่วงเวลา:

http://momentjs.com/

var myDateOfNowPlusThreeDays = moment().add(3, "days").toDate();

http://momentjs.com/docs/#/manipulating/

และสิ่งดีๆอื่น ๆ อีกมากมายในนั้น!

แก้ไข: การอ้างอิง jQuery ถูกลบออกขอบคุณความคิดเห็นของ aikeru


1
ไม่จำเป็นต้องมี jQuery :)
aikeru

ดียิ่งขึ้นในกรณีนั้น !!
RemarkLima

1
ใช่หลังจากที่ซื้อขายกับ Plain ol 'JS นานเกินไปฉันก็ใช้ Moment และมันก็ใช้งานได้ (tm)!
caseyamcl

ทำไมคุณต้องการใช้ปลั๊กอินเมื่อ JS ไม่กี่บรรทัดจะทำอย่างไร
Frenchie

@frenchie เพราะสิ่งที่เริ่มต้นในไม่กี่บรรทัดของ JS และเนื่องจากแอปพลิเคชันของคุณกำลังจัดการกับข้อมูลวันที่วันที่และเวลาอย่างชัดเจนในไม่ช้ามันจะเป็นสองสามบรรทัดของ JS จากนั้นคุณจะถูกขอให้แปลแอปข้าม 12 ภาษาและเขตเวลาและคุณอยากให้คุณเริ่มต้นด้วยช่วงเวลาเช่นนี้;)
RemarkLima

10

โซลูชันที่ออกแบบมาสำหรับผู้ปฏิบัติงานท่อ :

const addDays = days => date => {
  const result = new Date(date);

  result.setDate(result.getDate() + days);

  return result;
};

การใช้งาน:

// Without the pipeline operator...
addDays(7)(new Date());

// And with the pipeline operator...
new Date() |> addDays(7);

หากคุณต้องการฟังก์ชั่นเพิ่มเติมฉันขอแนะนำให้ดูในห้องสมุดdate-fns


8

เก่าฉันรู้ แต่บางครั้งฉันก็ชอบสิ่งนี้:

function addDays(days) {
    return new Date(Date.now() + 864e5 * days);
}

2
อันนี้เหมาะสมที่สุดสำหรับฉัน มันเรียบง่ายสง่างามและไม่ล้มเหลวในการสวดภาวนาต่อปัญหาที่เกิดขึ้นในช่วงหลายเดือน / ปี
uadrive

1
นำเสนอคำตอบที่ง่ายที่สุด การสร้างสิ่งนี้ต้นแบบ 'addDays' จะเป็นดังต่อไปนี้:Date.prototype.addDays = function(days) {return new Date(this.getTime() + (864e5 * days));};
CrazyIvan1974

ไม่ใช่ทุกวันมี 24 ชั่วโมงมันล้มเหลวเป็นเวลา DST และกระโดดวินาที
เตฟาน

8

ฉันมีปัญหาเกี่ยวกับการประหยัดเวลากลางวันด้วยวิธีแก้ไขปัญหาที่เสนอ

โดยใช้getUTCDate/ setUTCDateแทนฉันแก้ไขปัญหาของฉัน

// Curried, so that I can create helper functions like `add1Day`
const addDays = num => date => {
  // Make a working copy so we don't mutate the supplied date.
  const d = new Date(date);

  d.setUTCDate(d.getUTCDate() + num);

  return d;
}

8

คุณสามารถใช้ JavaScript โดยไม่ต้องใช้ jQuery:

var someDate = new Date();
var numberOfDaysToAdd = 6;
someDate.setDate(someDate.getDate() + numberOfDaysToAdd); 
Formatting to dd/mm/yyyy :

var dd = someDate.getDate();
var mm = someDate.getMonth() + 1;
var y = someDate.getFullYear();

var someFormattedDate = dd + '/'+ mm + '/'+ y;

8

ต้นแบบทั่วไปที่ไม่มีตัวแปรจะใช้กับค่าวันที่ที่มีอยู่:

Date.prototype.addDays = function (days) {
    return new Date(this.valueOf() + days * 864e5);
}

7

mozilla docs สำหรับ setDate () ไม่ได้ระบุว่าจะจัดการกับสถานการณ์สิ้นเดือน ดูhttps://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date

setDate ()

  • ตั้งค่าวันของเดือน (1-31) สำหรับวันที่ระบุตามเวลาท้องถิ่น

นั่นคือเหตุผลที่ฉันใช้ setTime () เมื่อฉันต้องการเพิ่มวัน


ฉันจะเชื่อมโยงไปยังเอกสาร ECMAScript แต่จะเผยแพร่ในรูปแบบ PDF (
Blake Mills

1
เรื่อง " mozilla docs สำหรับ setDate () ไม่ได้ระบุว่าจะจัดการกับสถานการณ์สิ้นเดือน " อัปเดต "เอกสาร" แล้วดังนั้นพวกเขาจึงทำได้ ;-)
RobG

7

ง่ายเหมือนนี้

new Date((new Date()).getTime() + (60*60*24*1000));

2
แม้ว่าจะเพิ่มวัน UTC แต่จะใช้วิธีการในท้องถิ่นและไม่อนุญาตให้ใช้สำหรับวันท้องถิ่นที่มีความยาวไม่เกิน 24 ชั่วโมงซึ่งจะเกิดขึ้นเมื่อการเปลี่ยนแปลงออฟเซ็ตของเขตเวลา (เช่นในและนอกเวลาออมแสง)
RobG

6

ฉันเดาว่าฉันจะให้คำตอบด้วย: โดย
ส่วนตัวแล้วฉันชอบที่จะพยายามหลีกเลี่ยงการประกาศตัวแปรที่ไม่มีค่าใช้จ่ายการเรียกใช้เมธอดและการเรียก Constructor เนื่องจากค่าใช้จ่ายมีประสิทธิภาพสูง (ด้วยเหตุผลแน่นอน)
ฉันจะปล่อยให้เรื่องนี้เป็นเพียงความคิดเห็นภายใต้คำตอบที่ได้รับจาก @AnthonyWJones แต่คิดว่าดีกว่า

// Prototype usage...
Date.prototype.addDays = Date.prototype.addDays || function( days ) {
    return this.setTime( 864E5 * days + this.valueOf() ) && this;
};

// Namespace usage...
namespace.addDaysToDate = function( date, days ) {
    return date.setTime( 864E5 * days + date.valueOf() ) && date;
};

// Basic Function declaration...
function addDaysToDate( date, days ) {
    return date.setTime( 864E5 * days + date.valueOf() ) && date;
};

ข้างต้นจะเคารพ DST หมายความว่าถ้าคุณเพิ่มจำนวนวันที่ข้าม DST เวลาที่แสดง (ชั่วโมง) จะเปลี่ยนไปตามนั้น
ตัวอย่าง:
2 พฤศจิกายน 2014 02:00 คือจุดสิ้นสุดของ DST

var dt = new Date( 2014, 10, 1, 10, 30, 0 );
console.log( dt );                  // Sat Nov 01 2014 10:30:00
console.log( dt.addDays( 10 ) );    // Tue Nov 11 2014 09:30:00

หากคุณต้องการรักษาเวลาผ่าน DST (ดังนั้น 10:30 จะยังคงเป็น 10:30) ...

// Prototype usage...
Date.prototype.addDays = Date.prototype.addDays || function( days ) {
    return this.setDate( this.getDate() + days ) && this;
};

// Namespace usage...
namespace.addDaysToDate = function( date, days ) {
    return date.setDate( date.getDate() + days ) && date;
};

// Basic Function declaration...
function addDaysToDate( date, days ) {
    return date.setDate( date.getDate() + days ) && date;
};

ดังนั้นตอนนี้คุณมี ...

var dt = new Date( 2014, 10, 1, 10, 30, 0 );
console.log( dt );                  // Sat Nov 01 2014 10:30:00
console.log( dt.addDays( 10 ) );    // Tue Nov 11 2014 10:30:00

6

ไม่จาวาสคริปต์ไม่มีฟังก์ชันในตัว แต่คุณสามารถใช้รหัสบรรทัดง่าย ๆ

timeObject.setDate(timeObject.getDate() + countOfDays);

5

ฉันใช้สิ่งที่ชอบ:

new Date(dateObject.getTime() + amountOfDays * 24 * 60 * 60 * 1000)

ทำงานร่วมกับการประหยัดเวลา:

new Date(new Date(2014, 2, 29, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)

ทำงานร่วมกับปีใหม่:

new Date(new Date(2014, 11, 31, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)

มันสามารถ parametrized:

function DateAdd(source, amount, step) {
  var factor = 1;
  if (step == "day") factor = 24 * 60 * 60 * 1000;
  else if (step == "hour") factor = 60 * 60 * 1000;
  ...
  new Date(source.getTime() + amount * factor);
}

4

ฉันใช้โซลูชันต่อไปนี้

var msInDay = 86400000;
var daysToAdd = 5;
var now = new Date();
var milliseconds = now.getTime();
var newMillisecods = milliseconds + msInDay * daysToAdd;
var newDate = new Date(newMillisecods);
//or now.setTime(newMillisecods);

Date มีตัวสร้างที่ยอมรับ int อาร์กิวเมนต์นี้แสดงถึงมิลลิวินาทีรวมก่อน / หลัง 1 มกราคม 1970 นอกจากนี้ยังมีเมธอด setTime ซึ่งทำเช่นเดียวกันโดยไม่ต้องสร้างวัตถุ Date ใหม่

สิ่งที่เราทำที่นี่คือแปลงวันเป็นมิลลิวินาทีและเพิ่มค่านี้เป็นค่าที่ได้รับจาก getTime สุดท้ายเราให้ผลลัพธ์เป็นวันที่ (มิลลิวินาที) ตัวสร้างหรือ setTime (มิลลิวินาที) วิธี


ไม่ใช่ทุกวันมี 24 ชั่วโมงมันล้มเหลวเป็นเวลา DST และกระโดดวินาที
เตฟาน

สเตฟานมีบัญชีห้องสมุดอื่น ๆ อีกหรือไม่
Vakhtang

now.setDate(now.getDate() + days);จัดการการเปลี่ยนแปลง DST โดยอัตโนมัติ และฉันต้องแก้ไขเผ่นวินาทีจะถูกละเว้นในการประทับเวลา JS
เตฟาน

4

แก้ไข: แทนที่จะเป็นsetTime()(หรือsetHours()) คุณสามารถทำได้ด้วยวิธีนี้:

Date.prototype.addDays= function(d){
  this.setDate(this.getDate() + d);
  return this;
};

var tomorrow = new Date().addDays(1);

เก่า:

แทนที่จะใช้setTime()คุณสามารถใช้setHours():

Date.prototype.addDays= function(d){
    this.setHours(this.getHours() + d * 24);
    return this;
};

var tomorrow = new Date().addDays(1);

ดูJSFiddle ...


ทำตามตรรกะนี้คุณสามารถเพิ่มหนึ่งวัน;)d.setDate(d.getDate() + 1);
Rivenfall


4

มีวิธีsetDateและgetDateซึ่งให้คุณทำสิ่งนี้:

var newDate = aDate.setDate(aDate.getDate() + numberOfDays);

หากคุณต้องการลบจำนวนวันและจัดรูปแบบวันที่ของคุณในรูปแบบที่มนุษย์สามารถอ่านได้คุณควรพิจารณาสร้างDateHelperวัตถุที่กำหนดเองซึ่งมีลักษณะดังนี้:

var DateHelper = {
    addDays : function(aDate, numberOfDays) {
        aDate.setDate(aDate.getDate() + numberOfDays); // Add numberOfDays
        return aDate;                                  // Return the date
    },
    format : function format(date) {
        return [
           ("0" + date.getDate()).slice(-2),           // Get day and pad it with zeroes
           ("0" + (date.getMonth()+1)).slice(-2),      // Get month and pad it with zeroes
           date.getFullYear()                          // Get full year
        ].join('/');                                   // Glue the pieces together
    }
}

// With this helper, you can now just use one line of readable code to :
// ---------------------------------------------------------------------
// 1. Get the current date
// 2. Add 20 days
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), 20));

(ดูซอนี้ )


4

การขยายต้นแบบใน javascript อาจไม่ใช่ความคิดที่ดีโดยเฉพาะอย่างยิ่งในรหัสฐานอาชีพ

สิ่งที่คุณต้องการทำคือขยายDateชั้นเรียนดั้งเดิม:

class MyCustomDate extends Date {

  addDays(days) {
    const date = new MyCustomDate(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
  }
  
}

const today = new MyCustomDate();

const nextWeek = today.addDays(7)

console.log(nextWeek)

ด้วยวิธีนี้หาก Javascript หนึ่งวันใช้addDaysวิธีเนทีฟคุณจะไม่ผิดเพี้ยน

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