การเพิ่มวันที่ใน JavaScript


433

ฉันต้องเพิ่มค่าวันที่โดยหนึ่งวันใน JavaScript

ตัวอย่างเช่นฉันมีค่าวันที่ 2010-09-11 และฉันต้องการเก็บวันที่ของวันถัดไปในตัวแปร JavaScript

ฉันจะเพิ่มวันที่แบบวันต่อวันได้อย่างไร


สิ่งนี้ตอบคำถามของคุณหรือไม่ เพิ่มวันในจาวาสคริปต์
Michael Freidgeim

คำตอบ:


791

สามตัวเลือกสำหรับคุณ:

1. ใช้Dateวัตถุของ JavaScript (ไม่มีไลบรารี่):

คำตอบก่อนหน้าของฉันสำหรับ # 1 ผิด (เพิ่ม 24 ชั่วโมงไม่สามารถเปลี่ยนไปเป็นและจากการปรับเวลาตามฤดูกาลได้Clever Humanชี้ให้เห็นว่าจะล้มเหลวเมื่อวันที่ 7 พฤศจิกายน 2010 ในเขตเวลาตะวันออก) แต่คำตอบที่ Jigar ของเป็นวิธีที่ถูกต้องในการทำเช่นนี้ไม่ห้องสมุด:

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

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

(คำตอบนี้ได้รับการยอมรับในขณะนี้ดังนั้นฉันไม่สามารถลบได้ก่อนที่จะได้รับการยอมรับฉันแนะนำให้ OP พวกเขายอมรับของ Jigar แต่บางทีพวกเขาอาจยอมรับคำสั่งนี้สำหรับรายการ # 2 หรือ # 3 ในรายการ)

2. ใช้MomentJS :

var today = moment();
var tomorrow = moment(today).add(1, 'days');

(ระวังว่าaddจะปรับเปลี่ยนอินสแตนซ์ที่คุณเรียกใช้แทนการส่งคืนอินสแตนซ์ใหม่ดังนั้นtoday.add(1, 'days')จะแก้ไขtodayนั่นคือสาเหตุที่เราเริ่มต้นด้วย op cloning var tomorrow = ...)

3. การใช้DateJSแต่ไม่ได้รับการอัปเดตเป็นเวลานาน:

var today = new Date(); // Or Date.today()
var tomorrow = today.add(1).day();

แต่ฉันมีวันที่ 2010-09-11 ในตัวแปรโดยใช้ document.getElementById ("Arrival_date") ค่ามันแสดงวันที่ไม่ถูกต้อง
Santanu

1
@santanu: นั่นเป็นปัญหาที่แตกต่างอย่างสิ้นเชิง: การแยกวันที่ (รับวันที่โดยการตีความสตริง) หากรูปแบบนั้นเป็นแบบคงที่คุณสามารถวิเคราะห์ได้ด้วยตนเองและป้อนผลลัพธ์ลงในตัวDateสร้าง ( new Date(year, month, date)); ดูหัวข้อ 15.9.2.1 ของข้อกำหนด ; ถ้าคุณต้องการที่จะยอมรับช่วงของรูปแบบแน่นอนดูที่DateJS
TJ Crowder

1
@santanu: เพียงทำตามด้านบน: เบราว์เซอร์บางตัวอาจแยกวิเคราะห์รูปแบบที่ประสบความสำเร็จด้วยDate.parse(ซึ่งจะคืนค่าจำนวนมิลลิวินาทีที่คุณสามารถป้อนเข้าไปnew Date(ms)) แต่ระวังนั่นอาจแตกต่างกันไปในแต่ละเบราว์เซอร์ จนกระทั่งเมื่อเร็ว ๆ Date.parseการใช้งานที่สามารถทำเพียงเกี่ยวกับสิ่งที่พวกเขาต้องการที่จะอยู่ใน ตอนนี้สเปครุ่นที่ 5 ใหม่นั้นมีรูปแบบขั้นต่ำที่ต้องยอมรับ แต่ฉันก็ยังไม่นับ
TJ Crowder

ฉันแค่ต้องการเพิ่มวินาทีในอินสแตนซ์วันที่; สิ่งนี้ได้ผลกับฉันx = new Date(); x2 = new Date(x.getTime() + 1000)โดยที่ 1,000 เพิ่มขึ้นเป็นมิลลิวินาที
berto

1
@piavgh: ไม่มีอะไรผิดปกติกับวิธีแก้ปัญหาแรกมันเป็นเพียงวิธีที่คุณใช้งาน Dateวัตถุไม่แน่นอน คุณกำลังเก็บวัตถุเดียวกัน Dateสามครั้งในอาเรย์ หากคุณต้องการDateวัตถุที่แตกต่างกันสามรายการคุณต้องสร้างวัตถุสามชิ้น:var unavailableDates = []; for (var d = new Date('2017-05-11'); d < new Date('2017-05-13'); d.setDate(d.getDate() + 1)) { unavailableDates.push(new Date(+d)); }
TJ Crowder

178
var myDate = new Date();

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

แต่ฉันมีวันที่ 2010-09-11 ในตัวแปรโดยใช้ document.getElementById ("Arrival_date") ค่ามันแสดงวันที่ไม่ถูกต้อง
Santanu

1
@sanatu: ในกรณีนี้คุณต้องจัดรูปแบบสตริงในแบบที่เบราว์เซอร์จะยอมรับ Chrome ยอมรับnew Date("2009-09-11")แต่ Firefox ไม่ต้องการ ผมคิดว่าเบราว์เซอร์ส่วนใหญ่ยอมรับเพื่อแก้ปัญหาง่ายจะเป็นnew Date("2009/09/11") var arrivalDate = document.getElementById('arival_date').value; var dayAfter = new Date(arrival_date.replace(/-/g, '/')); dayAfter.setDate(dayAfter.getDate()+1);
David Hedlund

5
แนวทางที่มั่นคงกว่าการแทนที่-ด้วย/และหวังว่าเบราว์เซอร์จะยอมรับมันจะแบ่งสตริงออกเป็นส่วน ๆ : var dateParts = arrivalDate.split('-'); var y = parseInt(dateParts[0], 10); var m = parseInt(dateParts[1], 10); var d = parseInt(dateParts[2], 10); var dayAfter = new Date(y, m-1, d+1);โปรดทราบว่าเรากำลังใช้m-1ที่นี่เพราะเดือน JavaScript เป็นค่า enum (มกราคมเป็น 0 ไม่ใช่ 1) และd+1เพราะเรา กำลังทำการเพิ่มขึ้นแล้วในการกำหนดเริ่มต้น (มันจะแก้ไขโดยอัตโนมัติในวันที่ 29 กุมภาพันธ์เป็นต้นไป)
David Hedlund

35

ไม่มีตัวอย่างใดในคำตอบนี้ที่ทำงานกับวันที่ปรับเวลาตามฤดูกาล ในวันเหล่านั้นจำนวนชั่วโมงในหนึ่งวันไม่ใช่ 24 (เป็น 23 หรือ 25 ขึ้นอยู่กับว่าคุณ "กระโดดไปข้างหน้า" หรือ "ถอยกลับ")

ฟังก์ชัน Javascript ของ AddDays ด้านล่างนี้สำหรับการปรับเวลาตามฤดูกาล:

function addDays(date, amount) {
  var tzOff = date.getTimezoneOffset() * 60 * 1000,
      t = date.getTime(),
      d = new Date(),
      tzOff2;

  t += (1000 * 60 * 60 * 24) * amount;
  d.setTime(t);

  tzOff2 = d.getTimezoneOffset() * 60 * 1000;
  if (tzOff != tzOff2) {
    var diff = tzOff2 - tzOff;
    t += diff;
    d.setTime(t);
  }

  return d;
}

นี่คือการทดสอบที่ฉันใช้ทดสอบฟังก์ชั่น:

    var d = new Date(2010,10,7);
    var d2 = AddDays(d, 1);
    document.write(d.toString() + "<br />" + d2.toString());

    d = new Date(2010,10,8);
    d2 = AddDays(d, -1)
    document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());

    d = new Date('Sun Mar 27 2011 01:59:00 GMT+0100 (CET)');
    d2 = AddDays(d, 1)
    document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());

    d = new Date('Sun Mar 28 2011 01:59:00 GMT+0100 (CET)');
    d2 = AddDays(d, -1)
    document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());

33

วิธีที่ง่ายที่สุดคือการแปลงเป็นมิลลิวินาทีและเพิ่ม 1,000 * 60 * 60 * 24 มิลลิวินาทีเช่น:

var tomorrow = new Date(today.getTime()+1000*60*60*24);

ฉันชอบกฎการแทนค่าจำนวนเต็มนี้
exebook

นี่คือคำตอบที่ดีที่สุด สามารถเพิ่ม / ลดจำนวนวันได้อย่างง่ายดายตามที่ร้องขอ เพียงแค่คูณ1000*60*60*24xDaysToBeAdded
Khalil Khalaf

หรือnew Date(+new Date() + 1000*60*60*24)แต่จริงๆแล้วมันคล้ายกับgetTime()/ setTime()จริงๆ
Polv

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

สายการบินnew Date(Date.now()+1000*60*60*24);
aiyan

28

พรุ่งนี้ในหนึ่งบรรทัดใน JS บริสุทธิ์ แต่มันน่าเกลียด !

new Date(new Date().setDate(new Date().getDate() + 1))

นี่คือผลลัพธ์:

Thu Oct 12 2017 08:53:30 GMT+0200 (Romance Summer Time)

14

คุณต้องแยกสตริงของคุณก่อนที่จะทำตามคำแนะนำของคนอื่น:

var dateString = "2010-09-11";
var myDate = new Date(dateString);

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

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

var y = myDate.getFullYear(),
    m = myDate.getMonth() + 1, // january is month 0 in javascript
    d = myDate.getDate();
var pad = function(val) { var str = val.toString(); return (str.length < 2) ? "0" + str : str};
dateString = [y, pad(m), pad(d)].join("-");

แต่ผมขอแนะนำให้รับ Date.js เป็นที่กล่าวถึงในการตอบอื่น ๆ ที่จะช่วยให้คุณมาก


7

ฉันรู้สึกว่าไม่มีอะไรปลอดภัยกว่า .getTime()และ.setTime()ดังนั้นควรเป็นสิ่งที่ดีที่สุดและเป็นนักแสดงด้วย

const d = new Date()
console.log(d.setTime(d.getTime() + 1000 * 60 * 60 * 24)) // MILLISECONDS

.setDate() สำหรับวันที่ไม่ถูกต้อง (เช่น 31 + 1) นั้นอันตรายเกินไปและขึ้นอยู่กับการใช้งานเบราว์เซอร์


5

รับอีก 5 วัน:

var date = new Date(),
d = date.getDate(),
m = date.getMonth(),
y = date.getFullYear();


for(i=0; i < 5; i++){
var curdate = new Date(y, m, d+i)
console.log(curdate)
}

พยายามคำตอบข้างต้น แต่ไร้ประโยชน์ รหัสของคุณทำงานได้อย่างมีเสน่ห์ ขอบคุณ!
dimmat

4

สองวิธี:

1:

var a = new Date()
// no_of_days is an integer value
var b = new Date(a.setTime(a.getTime() + no_of_days * 86400000)

2: คล้ายกับวิธีก่อนหน้า

var a = new Date()
// no_of_days is an integer value
var b = new Date(a.setDate(a.getDate() + no_of_days)

2

ได้รับค่าสตริงของวันที่โดยใช้ dateObj.toJSON () วิธี Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON Slice วันจากกลับ มูลค่าแล้วเพิ่มขึ้นตามจำนวนวันที่คุณต้องการ

var currentdate = new Date();
currentdate.setDate(currentdate.getDate() + 1);
var tomorrow = currentdate.toJSON().slice(0,10);

Date.toJSON ใช้ UTC timezone stackoverflow.com/questions/11382606/…
AndreyP

2
 Date.prototype.AddDays = function (days) {
    days = parseInt(days, 10);
    return new Date(this.valueOf() + 1000 * 60 * 60 * 24 * days);
}

ตัวอย่าง

var dt = new Date();
console.log(dt.AddDays(-30));
console.log(dt.AddDays(-10));
console.log(dt.AddDays(-1));
console.log(dt.AddDays(0));
console.log(dt.AddDays(1));
console.log(dt.AddDays(10));
console.log(dt.AddDays(30));

ผลลัพธ์

2017-09-03T15:01:37.213Z
2017-09-23T15:01:37.213Z
2017-10-02T15:01:37.213Z
2017-10-03T15:01:37.213Z
2017-10-04T15:01:37.213Z
2017-10-13T15:01:37.213Z
2017-11-02T15:01:37.213Z

รหัสของคุณใช้ไม่ได้ ฉันได้ลองกับ console.log แรก () และมันบอกว่า: dt.AddDays () ไม่ใช่ฟังก์ชั่น
Adrian2895

1

ไม่แน่ใจว่าเป็น BUG (ทดสอบ Firefox 32.0.3 และ Chrome 38.0.2125.101) แต่รหัสต่อไปนี้จะล้มเหลวในบราซิล (-3 GMT):

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

$date = new Date(2014, 9, 16,0,1,1);
$date.shiftDays(1);
console.log($date+"");
$date.shiftDays(1);
console.log($date+"");
$date.shiftDays(1);
console.log($date+"");
$date.shiftDays(1);
console.log($date+"");

ผลลัพธ์:

Fri Oct 17 2014 00:01:01 GMT-0300
Sat Oct 18 2014 00:01:01 GMT-0300
Sat Oct 18 2014 23:01:01 GMT-0300
Sun Oct 19 2014 23:01:01 GMT-0200

การเพิ่มหนึ่งชั่วโมงในวันที่จะทำให้มันทำงานได้อย่างสมบูรณ์แบบ (แต่ไม่ได้แก้ปัญหา)

$date = new Date(2014, 9, 16,0,1,1);

ผลลัพธ์:

Fri Oct 17 2014 01:01:01 GMT-0300
Sat Oct 18 2014 01:01:01 GMT-0300
Sun Oct 19 2014 01:01:01 GMT-0200
Mon Oct 20 2014 01:01:01 GMT-0200

1

แสดงผลลัพธ์เป็นสตริงของวันที่ในวันพรุ่งนี้ ใช้ Date ใหม่ () เพื่อรับวันที่วันนี้เพิ่มหนึ่งวันโดยใช้ Date.getDate () และ Date.setDate () และแปลงวัตถุ Date เป็นสตริง

  const tomorrow = () => {
      let t = new Date();
      t.setDate(t.getDate() + 1);
      return `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, '0')}-${String(
        t.getDate()
      ).padStart(2, '0')}`;
    };
    tomorrow();

1

การเพิ่มปีของวันที่ด้วย vanilla js:

start_date_value = "01/01/2019"
var next_year = new Date(start_date_value);
next_year.setYear(next_year.getYear() + 1);
console.log(next_year.getYear()); //=> 2020

ในกรณีที่มีคนต้องการเพิ่มมูลค่าอื่น ๆ กว่าวันที่ (วัน)


1

ใช้ Native JS เพื่อเพิ่มหนึ่งวันคุณสามารถทำสิ่งต่อไปนี้:

let date = new Date(); // today
date.setDate(date.getDate() + 1) // tomorrow

ตัวเลือกอื่นคือการใช้momentไลบรารี:

const date = moment().add(14, "days").toDate()

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

1

วันที่เพิ่มการตระหนักถึงการประหยัดเวลาในเขตเวลา / กลางวันสำหรับ JavaScript วันที่:

function nextDay(date) {
    const sign = v => (v < 0 ? -1 : +1);
    const result = new Date(date.getTime());
    result.setDate(result.getDate() + 1);
    const offset = result.getTimezoneOffset();
    return new Date(result.getTime() + sign(offset) * offset * 60 * 1000);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.