ฉันจะเพิ่ม 1 วันในวันที่ปัจจุบันได้อย่างไร?


93

ฉันมีออบเจ็กต์ Date ปัจจุบันที่ต้องเพิ่มขึ้นทีละวันโดยใช้วัตถุ JavaScript Date ฉันมีรหัสต่อไปนี้:

var ds = stringFormat("{day} {date} {month} {year}", { 
                day: companyname.i18n.translate("day", language)[date.getUTCDay()], 
                date: date.getUTCDate(), 
                month: companyname.i18n.translate("month", language)[date.getUTCMonth()], 
                year: date.getUTCFullYear() 
});

ฉันจะเพิ่มหนึ่งวันเข้าไปได้อย่างไร?

ฉันได้เพิ่ม +1 ให้getUTCDay()แล้วgetUTCDate()แต่มันไม่แสดงคำว่า "วันอาทิตย์" dayซึ่งฉันคาดว่าจะเกิดขึ้น


1
"เพิ่ม +1" หมายความว่าอย่างไร คุณต้องการวันถัดไปหรืออย่างอื่น?
Aleks G

ไม่date: (date.getUTCDate()+1)ทำงาน (ใช้ได้กับฉัน)? เป็นไปได้ว่ามีการตั้งชื่อขัดแย้งกับdate(as Date () - Object และเป็น Object-Key คุณลองเรียก Date () - Object ต่างกันหรือไม่
Dominik Schreiber

ปัจจุบันแสดงเฉพาะ: <option value = "2012-04-06"> เสาร์ที่ 6 เมษายน 2555 </option> <option value = "2012-04-07"> 7 เมษายน 2555 </option> ไม่ใช่ "วันอาทิตย์ 7 เม.ย. 2555 "
คลั่ง

ดังนั้นไม่ใช่สิ่งที่7 Aprคุณต้องการ (สิ่งที่ 'เพิ่มในวันถัดไป' สำหรับฉัน) มันคือไฟล์Sunday. อย่าลืมเพิ่ม+1ทั้งในday:และdate:(หรือตามที่คำตอบปัจจุบันกล่าวถึงก่อนหน้านี้)
Dominik Schreiber

คำตอบ:


238

ในการเพิ่มวันในวัตถุวันที่:

var date = new Date();

// add a day
date.setDate(date.getDate() + 1);

ดูคำถามที่ซ้ำกัน: stackoverflow.com/questions/3674539/… . คำตอบนี้ดี แต่ไม่ได้คำนึงถึง DST มี 2 ​​วันของปีที่ไม่มี 24 ชั่วโมง
Jess

2
@ Jess - ขึ้นอยู่กับว่าคุณต้องการให้มีการเปลี่ยนแปลงอย่างไรในการนำเสนอ DST คำถามถามว่าจะเพิ่มวันที่ได้อย่างไรนั่นคือคำตอบข้างต้น การเพิ่ม 24 ชั่วโมงไม่จำเป็นต้องเพิ่มวันที่นั้น แต่การเพิ่มวันที่ในท้องถิ่นโดยใช้setDateจะทำได้เสมอ
RobG

นี่คือสิ่งที่ฉันหมายถึง เพิ่มขึ้น 10 มีนาคม: var a = new Date("2013-03-10T00:00:00.000Z"); a.setDate(a.getDate() + 1); a.toISOString();คือ"2013-03-10T23:00:00.000Z". นี่เป็นกรณีที่ละเอียดอ่อนซึ่งฟังก์ชันข้างต้นไม่ได้ผลสำหรับฉัน
Jess

1
ไม่แน่นอน! คุณเริ่มต้นด้วยเวลา UTC จากนั้นจึงแปลงเป็นเวลาท้องถิ่นเพิ่มวันจากนั้นแปลงกลับเป็น UTC ดังนั้นวันหนึ่งจึงถูกเพิ่มเข้าไปในวันที่ท้องถิ่นแต่เป็นเวลา UTC เพียง 23 ชม. หากคุณเพิ่ม 1 ในวันที่ UTC คุณจะได้รับกลับ 01:00:00 ตามเวลาท้องถิ่น พฤติกรรมดังกล่าวไม่ซ้ำกับการออมแสงเป็นผลมาจากการใช้เขตเวลาที่ต่างกันสามเขต
RobG

8
อ๊าาา. ฉันไม่ทราบว่าgetDateกำลังแปลงจาก UTC เป็นเวลาท้องถิ่น a.setUTCDate(a.getUTCDate() + 1);<- ที่ใช้ได้กับวันที่ Zulu
Jess

40

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

เช่น 28 ก.พ. หรือ 31 มี.ค.

นี่คือตัวอย่างของวิธีที่ฉันจะทำ:

var current = new Date(); //'Mar 11 2015' current.getTime() = 1426060964567
var followingDay = new Date(current.getTime() + 86400000); // + 1 day in ms
followingDay.toLocaleDateString();

imo นี้รับประกันความถูกต้อง

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

var today = new Date('12/31/2015');
var tomorrow = new Date(today);
tomorrow.setDate(today.getDate()+1);
tomorrow.toLocaleDateString();

imho นี้ === 'POOP'

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

var dd = new Date(); // or any date and time you care about 
var dateArray =  dd.toISOString().split('T')[0].split('-').concat( dd.toISOString().split('T')[1].split(':') );
// ["2016", "07", "04", "00", "17", "58.849Z"] at Z 

ตอนนี้เพื่อความสนุก!

var date = { 
    day: dateArray[2],
    month: dateArray[1],
    year: dateArray[0],
    hour: dateArray[3],
    minutes: dateArray[4],
    seconds:dateArray[5].split('.')[0],
    milliseconds: dateArray[5].split('.')[1].replace('Z','')
}

ตอนนี้เรามีวัตถุวันที่สากลที่ถูกต้องอย่างเป็นทางการของเราซึ่งเขียนไว้อย่างชัดเจนที่เส้นเมริเดียนซูลู ตอนนี้เพื่อเปลี่ยนวันที่

  dd.setDate(dd.getDate()+1); // this gives you one full calendar date forward
  tomorrow.setDate(dd.getTime() + 86400000);// this gives your 24 hours into the future. do what you want with it.

การเพิ่มวินาที / มิลลิวินาทีจะใช้ไม่ได้สำหรับการออมแสง
Matt H

@Matt H คุณได้แนวคิดนั้นมาจากไหน เวลาถูกกำหนดเป็น UTC เป็นมิลลิวินาทีตั้งแต่ 1970/01/01
Peter the Russian

1
จะเป็นวันถัดไปในเวลา UTC ใช่ แต่ไม่จำเป็นต้องเป็นเวลาท้องถิ่น ในวัน Spring Forward ในสหรัฐอเมริกามีเวลา 25 ชั่วโมงต่อวัน ดังนั้นหากคุณมีเวลาเช่น 31/3/58 เป็นเวลา 00:00 น. และเพิ่ม 86400000 มิลลิวินาทีในวัน Sprint Forward เวลาท้องถิ่นจะเป็น 31/3/58 เวลา 23:00 น. เนื่องจากมีเวลา 25 ชั่วโมงในวันนั้น
Matt H

3
คุณจะเห็นเอฟเฟกvar dte = Date.parse('2015-11-01'); console.log(dte); dte.setTime(dte.getTime() + 86400000 ); console.log(dte);
ต์

1
นี่คือการออกแบบมากเกินไป หากคุณมีปัญหาเช่นนี้ให้ใช้ไลบรารีเช่นช่วงเวลาหรือบางสิ่งเพื่อช่วยให้สิ่งต่างๆง่ายขึ้น
Joshua Michael Wagoner

11

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

new Date(Date.now() + ( 3600 * 1000 * 24))

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


การเพิ่มหนึ่งวันของมิลลิวินาทีจะล้มเหลวเนื่องจากไม่ใช่ทุกวันที่ยาวนาน 24 ชั่วโมงในสถานที่ที่มีการออมแสง เช่นประเทศชิลีสิ้นสุดเวลาออมแสงในเวลาเที่ยงคืนของวันที่ 14 พฤษภาคม 2017 นาฬิกาจะย้อนกลับตั้งแต่เที่ยงคืนถึง 23:00 น. ดังนั้นการเพิ่ม 24 ชั่วโมงในวันที่ 2017-05-13 00:00:00 จะให้ผล 2017-05-13 23:00:00 และวันที่จะไม่เปลี่ยนแปลง (เบราว์เซอร์บางตัวจะทำเวลาเที่ยงคืนตรงและอื่น ๆ หนึ่งมิลลิวินาทีหลังจากนั้น) . :-(
RobG

2

แรงบันดาลใจจากjpmottinในคำถามนี้นี่คือรหัสบรรทัดเดียว:

var dateStr = '2019-01-01';
var days = 1;

var result = new Date(new Date(dateStr).setDate(new Date(dateStr).getDate() + days));

document.write('Date: ', result); // Wed Jan 02 2019 09:00:00 GMT+0900 (Japan Standard Time)
document.write('<br />');
document.write('Trimmed Date: ', result.toISOString().substr(0, 10)); // 2019-01-02

หวังว่านี่จะช่วยได้


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