Thêm ngày vào ngày JavaScript


1096

Cách thêm ngày vào hiện tại Datebằng JavaScript. JavaScript có chức năng tích hợp như .Net AddDaykhông?

Câu trả lời:


1211

Bạn có thể tạo một cái với: -

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

Điều này quan tâm đến việc tự động tăng tháng nếu cần thiết. Ví dụ:

8/31 + 1 ngày sẽ trở thành 9/1 .

Vấn đề với việc sử dụng setDatetrực tiếp là nó là một trình biến đổi và loại điều đó tốt nhất nên tránh. ECMA thấy phù hợp để coi Datelà một lớp có thể thay đổi hơn là một cấu trúc bất biến.


17
Đơn giản hóa:Date.prototype.addDays=function(d){return new Date(this.valueOf()+864E5*d);};
Duncan

27
@Duncan Bạn có chắc cái này giống như trên không? Điều này chỉ đơn giản là thêm 24 giờ, nhưng một ngày không phải lúc nào cũng là 24 giờ . Tôi đoán câu hỏi là làm thế nào để tăng phần ngày thêm 1 ngày, mà không thay đổi phần thời gian.
Tamás Bolvári

88
864E5vì một số lý do tôi thích viết 24*60*60mã của mình :)
Mars Robertson

62
Các bạn, đừng sử dụng phương pháp thêm 864E5 vì điều này không mất sự khác biệt về tiết kiệm ánh sáng ban ngày trong đó ngày có thể là 23 hoặc 25 giờ.
sbrbot

12
Đối với những người bạn lo lắng về Tiết kiệm ánh sáng ban ngày - Đừng. Các thuật toán này thay đổi ngày cơ bản, không phải cách diễn giải ngày. DST được triển khai trong các getters và setters của ngày - các getters để trừ một giờ vào mùa hè, và setter để thêm giờ đó trở lại trong mùa hè để bình thường hóa thời gian. Nhưng chỉ khi sử dụng một giờ tuyệt đối - giờ tương đối không cần phải được giải thích. Đây là lý do tại sao toán học ngày hoạt động. IMHO ...
Gerard ONeill

755

Câu trả lời đúng :

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

Câu trả lời không chính xác :

Câu trả lời này đôi khi cung cấp kết quả chính xác nhưng rất thường trả về năm và tháng sai. Lần duy nhất câu trả lời này hoạt động là khi ngày mà bạn thêm ngày sẽ xảy ra để có năm và tháng hiện tại.

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

Bằng chứng / Ví dụ

Kiểm tra JsFiddle này


@bzlm, Có cơ bản giống nhau. Nó chỉ không sửa đổi nguyên mẫu Ngày. Tôi cũng muốn chỉ ra những sai sót trong câu trả lời chính.
sparebytes

Câu trả lời được chấp nhận đã được chỉnh sửa một hai tuần trước để chỉ ra sai sót của nó. Bạn có nghĩ rằng nó cần chỉnh sửa thêm? Nếu vậy thì thế nào?
bzlm

7
@bzlm: Có, tôi tin rằng ghi chú nên đọc "cách tiếp cận này không thành công nếu ngày 'từ' không cùng năm hoặc tháng với ngày hiện tại ". Tôi vẫn lo lắng rằng người dùng sẽ lướt qua câu trả lời và không đọc cảnh báo vì nó không nổi bật. Cảm ơn.
sparebytes

3
Tôi nghĩ, ngay cả khi công việc này không đúng. Không có hàm tạo nào cho Ngày: var result = new Date (date); , xem http://www.w3schools.com/js/js_dates.asp . Ngay cả khi điều này thường hoạt động, đôi khi có thể dẫn đến kết quả sai do chuyển đổi thành chuỗi và ngược lại. Nó phải là var result = new Date (date.getTime ());
Marcin

2
@AnkitBalyan, Xem câu trả lời khác. Nó có thể không hoạt động chính xác do Thời gian tiết kiệm ánh sáng ban ngày
sparebytes

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

Hãy cẩn thận, bởi vì điều này có thể là khó khăn. Khi đặt "ngày mai", nó chỉ hoạt động vì giá trị hiện tại của nó khớp với năm và tháng cho "hôm nay". Tuy nhiên, cài đặt thành số ngày như "32" thông thường sẽ vẫn hoạt động tốt để chuyển nó sang tháng tiếp theo.


1
Vâng? Nhưng cái này là gì? (chạy vào ngày 31 tháng 3 năm 2010): hôm nay = Ngày mới (); ngày mai = ngày mới (); ngày mai.setDate (today.getDate () + 1); cảnh báo (ngày mai.getMonth ()); Nói "3". cảnh giác (ngày mai); là chính xác ... Tại sao ???
d -_- b

12
@sims tháng là 0 chỉ mục. Tháng 3 là tháng 4
Joel Coehoorn

7
Tại sao cần phải tạo 2 đối tượng ngày riêng biệt? Tại sao không chỉ đơn giản là sử dụng cùng một đối tượng ngày : var d = new Date(); d.setDate( d.getDate() + 1 );?
Joseph Silber

8
Cách tiếp cận này không hoạt động trong nhiều năm. Nếu ngày bắt đầu của bạn là từ một vài năm trước, getDate()trả về ngày của năm đó . Sau đó, gọi setDateđặt ngày trong năm hiện tại . Vì vậy, nó KHÔNG phải là một giải pháp chung tốt. Câu trả lời của @ AnthonyWJones thực sự hoạt động chính xác.
vẽ Noakes

3
@ DrewNoakes, khẳng định của bạn rằng nó không hoạt động trong nhiều năm là sai. getDate trả về ngày trong tháng, không phải "ngày của năm đó". Eg var d = new Date(2015,11,30);d.setDate(d.getDate() + 370)đưa ra ngày 3 tháng 1 năm 2017 kéo dài 2 năm.
RobG

124

Giải pháp đơn giản của tôi là:

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

giải pháp này không có vấn đề với thời gian tiết kiệm ánh sáng ban ngày. Ngoài ra, người ta có thể thêm / phụ bất kỳ khoản bù nào trong nhiều năm, tháng, ngày, v.v.

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

là mã chính xác.


13
Lưu ý: điều này đặt lại thời gian đến 00:00:00 (có thể là vấn đề hay không)
Álvaro González

Không làm việc vào ngày cuối cùng của bất kỳ tháng nào, như bạn nói. Làm cho điều này không thể sử dụng vào 12 ngày trong năm. Âm thanh như một cơn ác mộng để gỡ lỗi !!!
vẽ Noakes

6
Không có Drew, nó có thể sử dụng cho tất cả các ngày trong năm. Bạn có thể đặt bù ngày lớn hơn 31 hoặc bù tháng lớn hơn 12 và hàm này sẽ tính toán lại theo ngày trong tháng tiếp theo hoặc tháng trong năm tới. Vì vậy, ví dụ: nextday = new Date (oldDate.getFullYear (), oldDate.getMonth (), oldDate.getDate () + 40); là mã hoàn toàn tốt.
sbrbot

có getMonth () + 22 - bạn nghĩ nó sẽ hoạt động như thế nào!?
sbrbot

1
Tôi đồng ý, sử dụng cách này. Chúng tôi chỉ gặp một lỗi vì tiết kiệm thời gian ban ngày vì chúng tôi đang sử dụng setDate.
Jelle

95

Những câu trả lời này có vẻ khó hiểu với tôi, tôi thích:

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

getTime () cung cấp cho chúng tôi một phần nghìn giây kể từ năm 1970 và 86400000 là số mili giây trong một ngày. Do đó, ms chứa mili giây cho ngày mong muốn.

Sử dụng hàm tạo mili giây cho đối tượng ngày mong muốn.


46
Giải pháp này không tính đến tiết kiệm ánh sáng ban ngày. Vì vậy, ví dụ, điều này sẽ trở lại cùng ngày, 23 giờ sau: new Date(new Date('11/4/2012').getTime() + 86400000)
Noah Harrison

6
@NoahMiller Vấn đề mà bạn đưa ra có thể là một tính năng không phải là lỗi! Thêm 24 giờ mỗi ngày đôi khi là điều nên làm, với mục tiêu biết thời gian kết quả dựa trên DST. Ngày mà ví dụ của bạn trả về có giá trị thời gian là 11 giờ tối ngày 4 tháng 11, tức là 24 giờ sau đó là vào ngày cụ thể đó. Các poster ban đầu hỏi về datetime dường như cho thấy một số mong muốn cho thời gian chính xác trong ngày. Câu trả lời này là chính xác nếu bạn ở trong trường hợp khi mục tiêu của bạn là thời gian 24 giờ sau đó.
Andy Novocin

3
Tôi đồng ý với Nô-ê, var d2 = Ngày mới (d1.valueOf () + 24 * 60 * 60 * 1000) thực hiện những gì nó nói, thêm một ngày tích tắc đáng giá vào một ngày.
Corey Alix

6
Điều này là hoàn toàn chính xác cho một số trường hợp (ví dụ cho cookie 1 ngày) và một giải pháp đơn giản hơn so với hầu hết các trường hợp khác. Tôi không hiểu tại sao nó có quá nhiều lượt tải xuống và rất ít lượt
upvote

48

Thử

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

Sử dụng setDate () để thêm ngày sẽ không giải quyết được vấn đề của bạn, hãy thử thêm một số ngày vào tháng 2, nếu bạn cố thêm ngày mới vào đó, điều đó sẽ không dẫn đến kết quả bạn mong đợi.


26
Không, điều này không nên được đánh dấu là câu trả lời chính xác vì giải pháp này giả định rằng mỗi ngày có 24 * 60 * 60 * 1000 giây nhưng không (tiết kiệm ánh sáng ban ngày)!
sbrbot

Có bằng chứng nào về vấn đề 'Tháng Hai' với setDate()? Có phải đây không: stackoverflow.com/questions/5497637/ từ
nobar 4/213

9
+1 Điều này NÊN được đánh dấu là câu trả lời đúng. Tôi tin rằng "tiết kiệm ánh sáng ban ngày" là về trình bày chứ không phải về giá trị , mà chỉ là số mili giây. Từ quan điểm giá trị - ngày là số CONST của millisec, trong khi về mặt trình bày, nó có thể thay đổi.
biến mất

1
@ disfated, đây không phải là câu trả lời đúng. Ngày hết tiết kiệm ánh sáng ban ngày có 25 giờ, nhưng phương pháp này chỉ thêm 24 nên ngày sẽ giống nhau. Sử dụng 24 giờ để thể hiện một ngày hoạt động nếu phương pháp UTC được sử dụng thay thế, nhưng tại sao phải bận tâm khi sử dụng setDate thì thuận tiện hơn? ;-)
RobG

38

Chỉ cần dành nhiều thời gian cố gắng tìm ra những gì thỏa thuận với năm không thêm khi làm theo các ví dụ chính dưới đây.

Nếu bạn muốn chỉ đơn giản là thêm n ngày vào ngày bạn có thì tốt nhất bạn chỉ nên đi:

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

hoặc phiên bản dài

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

Điều này hôm nay / ngày mai là khó hiểu. Bằng cách đặt ngày hiện tại vào biến ngày mới, bạn sẽ làm rối giá trị năm. nếu bạn làm việc từ ngày ban đầu, bạn sẽ không.


7
Đọc tất cả các câu trả lời xung quanh cho đến khi tôi tìm thấy viên ngọc này ở đây. Bây giờ điều đó có ý nghĩa. Thật ngạc nhiên khi điều hôm nay / ngày mai đã được sao chép trong hầu hết tất cả các câu trả lời, khi nó hoàn toàn không có ý nghĩa gì và nó không "dễ đọc và rõ ràng" như tác giả đã nói trong câu trả lời được đánh giá cao nhất - trong phần bình luận được đánh giá cao nhất-, đó là khó hiểu và một thực tiễn xấu và sai
Cesc

23

Nếu bạn có thể, hãy sử dụng khoảnh khắc . JavaScript không có các phương thức ngày / thời gian riêng rất tốt. Sau đây là một ví dụ Cú pháp của 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>

Tham khảo: http://momentjs.com/docs/#/manipulation/add/


1
@ kpull1 người hỏi không hạn chế miền giải pháp bằng cách hỏi xem có tồn tại giải pháp tích hợp không.
dùng2910265

4
Lưu ý hiện đại: Moment.js cực kỳ nặng để thêm vào cho một mục đích nhỏ như vậy. Đó là vài trăm KB, và không thân thiện với webpack.
Joshua Comeau

1
Thư viện ưa thích của chúng tôi là date-fns. Webpack thân thiện, nhanh chóng và coi Ngày là bất biến.
Freewalker

1
@LukeWilliams chưa bao giờ nghe nói về date-fns cho đến bây giờ. sẽ kiểm tra nó cảm ơn.
dùng2910265

2
@JoshuaComeau Nếu bạn tải xuống từ cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.3/moment.min.js , nó sẽ chiếm tới 53.248 byte trên đĩa. Tôi tưởng tượng đó là toàn bộ quả bóng, nhưng tôi không biết. Dù sao, bất cứ điều gì. Nó không phải là một việc lớn.
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
Upvote cho không yêu cầu một biến ngày trung gian.
Jeff Lowery

đây là câu trả lời tốt nhất vì nó không có đột biến
knocte

Không phải ngày nào cũng có 24h, nó thất bại trong DST và giây nhuận.
Stephan

19

Tôi đã tạo các tiện ích mở rộng này tối qua:
bạn có thể chuyển các giá trị dương hoặc âm;

thí dụ:

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
Phương thức .addDays () không hoạt động đối với các ngày vượt qua ranh giới thời gian tiết kiệm ánh sáng ban ngày.
mskfisher

1
Đây là một trong những câu trả lời tốt hơn ở đây bởi vì bạn (chính xác) sử dụng số millis kể từ epoc để biểu thị ngày / lần và thêm số lượng millis để điều chỉnh ... Tại sao sau đó bạn không theo kịp "addMonths"! ? Và tại sao không thêm năm? Bạn đã chán
Robin

Khác với tháng, khoảng thời gian có thể được biểu thị bằng số tĩnh. Nhưng tháng có thể là bốn chiều dài khác nhau. Ngoài ra, bất kỳ khoảng thời gian dài nào từ Ngày trở lên có thể có độ dài thay đổi tại DST, vì vậy bạn không thể sử dụng bổ sung dựa trên thời gian nữa mà không có mức độ phức tạp khác. Tôi đã thêm addYears () và tôi đã sửa addMonths ().
Suamere

14

Không sử dụng biến thứ hai, bạn có thể thay thế 7 bằng x ngày tiếp theo của mình:

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

14

để trừ 30 ngày sử dụng (24h = 86400000ms)

new Date(+yourDate - 30 *86400000)


Khi cố gắng tính thời gian ngày luôn ghi nhớ thời gian ngày đó dựa trên mili giây trong khoa học máy tính, ( en.wikipedia.org/wiki/System_time#Retrieving_system_time ) Ngày mới (+ yourDate + 30 * (24 * 60 * 60 * 1000))
Ashraf Abusada

13

Giải pháp đơn giản nhất.

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


Tôi nghĩ rằng đây là giải pháp tốt nhất. Nếu chúng tôi mở rộng lớp Ngày, thì điều tốt hơn là bản thân Ngày được cập nhật.
Porlune

10

Cảm ơn Jason vì câu trả lời của bạn hoạt động như mong đợi, đây là một kết hợp từ mã của bạn và định dạng tiện dụng của AnthonyWJones:

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

6
Nó không tính đến việc tiết kiệm ánh sáng ban ngày khi có nhiều hơn hoặc ít hơn 86400000 giây trong một ngày và có thể dẫn đến lỗi logic (lỗi chương trình) trong mã của bạn.
sbrbot

Đôi khi điều đó là cần thiết. API eBay có các phiên đấu giá x ngày, dựa trên 24 giờ để mặt hàng của bạn sẽ kết thúc vào một thời điểm khác với thời gian tăng nếu trạng thái DST thay đổi giữa phiên đấu giá. Trong trường hợp đó, bạn cần sử dụng loại hàm này để tránh các lỗi logic.
Andy Novocin

10

Đi dự tiệc muộn, nhưng nếu bạn sử dụng jQuerythì có một plugin tuyệt vời có tên là Moment:

http://momentjs.com/

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

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

Và rất nhiều thứ tốt khác trong đó!

Chỉnh sửa: Tham chiếu jQuery bị xóa nhờ nhận xét của aikeru


1
Khoảnh khắc không cần jQuery :)
aikeru

Thậm chí tốt hơn trong trường hợp đó !!
RemarkLima

1
Vâng, sau khi làm quen với Plain ol 'JS quá lâu, tôi đã sử dụng Khoảnh khắc và nó chỉ hoạt động (tm)!
caseyamcl

Tại sao bạn muốn sử dụng plugin khi một vài dòng JS sẽ làm?
Frenchie

@fblerie bởi vì, bắt đầu bằng một vài dòng JS và vì rõ ràng ứng dụng của bạn đang thao túng thông tin liên quan đến ngày, ngày và thời gian, nên sẽ sớm có vài 1000 dòng JS, sau đó bạn sẽ được yêu cầu bản địa hóa ứng dụng 12 ngôn ngữ và múi giờ và bạn muốn bạn đã bắt đầu với một cái gì đó giống như khoảnh khắc;)
RemarkLima

10

Một giải pháp được thiết kế cho người vận hành đường ống :

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

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

  return result;
};

Sử dụng:

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

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

Nếu bạn cần thêm chức năng, tôi khuyên bạn nên tìm hiểu thư viện date-fns .


8

Cũ tôi biết, nhưng đôi khi tôi thích điều này:

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

2
Điều này có ý nghĩa nhất đối với tôi. Nó đơn giản, thanh lịch và không cầu nguyện cho các vấn đề di chuyển qua nhiều tháng / năm.
uadrive

1
Câu trả lời đơn giản nhất được trình bày. Dựa trên điều này, nguyên mẫu 'addDays' sẽ như sau:Date.prototype.addDays = function(days) {return new Date(this.getTime() + (864e5 * days));};
CrazyIvan1974

Không phải ngày nào cũng có 24h, nó thất bại trong DST và giây nhuận.
Stephan

8

Tôi đã có vấn đề với thời gian tiết kiệm ánh sáng ban ngày với giải pháp đề xuất.

Bằng cách sử dụng getUTCDate/ setUTCDatethay vào đó, tôi đã giải quyết vấn đề của mình.

// 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

Bạn có thể sử dụng JavaScript, không yêu cầu 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

Nguyên mẫu chung không có biến, nó áp dụng cho giá trị Ngày hiện tại:

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

7

Các tài liệu mozilla cho setDate () không chỉ ra rằng nó sẽ xử lý các tình huống cuối tháng. Xem https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date

đặt ngày()

  • Đặt ngày trong tháng (1-31) cho một ngày được chỉ định theo giờ địa phương.

Đó là lý do tại sao tôi sử dụng setTime () khi tôi cần thêm ngày.


Tôi sẽ liên kết đến các tài liệu ECMAScript, nhưng chúng được phát hành dưới dạng PDF; (
Blake Mills

1
Re " tài liệu mozilla cho setDate () không cho biết rằng nó sẽ xử lý các tình huống cuối tháng ". Các "tài liệu" đã được cập nhật để bây giờ họ làm. ;-)
RobG

7

Đơn giản như thế này:

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

2
Mặc dù điều này không thêm ngày UTC, nhưng nó sử dụng các phương thức cục bộ và không cho phép những ngày địa phương không kéo dài 24 giờ, điều này xảy ra khi bù múi giờ thay đổi (ví dụ: tiết kiệm trong và ngoài ánh sáng ban ngày).
RobG

6

Tôi đoán tôi cũng sẽ đưa ra câu trả lời:
Cá nhân, tôi muốn tránh khai báo biến vô cớ, gọi phương thức và gọi hàm tạo, vì tất cả chúng đều đắt về hiệu năng. (trong lý do, tất nhiên)
Tôi sẽ để lại điều này như là nhận xét dưới Câu trả lời được đưa ra bởi @AnthonyWJones nhưng nghĩ tốt hơn về nó.

// 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;
};

Ở trên sẽ tôn trọng DST. Có nghĩa là nếu bạn thêm một số ngày vượt qua DST, thời gian (giờ) được hiển thị sẽ thay đổi để phản ánh điều đó.
Ví dụ:
ngày 2 tháng 11 năm 2014 02:00 là ngày kết thúc 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

Nếu bạn đang tìm cách giữ lại thời gian trên DST (vì vậy 10:30 vẫn sẽ là 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;
};

Vì vậy, bây giờ bạn có ...

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

Không, javascript không có chức năng tích hợp, nhưng bạn có thể sử dụng một dòng mã đơn giản

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

5

Tôi sử dụng một cái gì đó như:

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

Hoạt động với thời gian tiết kiệm trong ngày:

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

Làm việc với năm mới:

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

Nó có thể được tham số hóa:

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

Tôi đang sử dụng giải pháp sau đây.

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

Ngày có một hàm tạo chấp nhận một int. Đối số này biểu thị tổng số mili giây trước / sau ngày 1 tháng 1 năm 1970. Nó cũng có một phương thức setTime thực hiện tương tự mà không tạo đối tượng Ngày mới.

Những gì chúng tôi làm ở đây là chuyển đổi ngày thành mili giây và thêm giá trị này vào giá trị được cung cấp bởi getTime. Cuối cùng, chúng tôi đưa kết quả cho phương thức khởi tạo Date (mili giây) hoặc phương thức setTime (mili giây).


Không phải ngày nào cũng có 24h, nó thất bại trong DST và giây nhuận.
Stephan

Stephan, có tài khoản thư viện nào khác cho điều đó không?
Vakhtang

now.setDate(now.getDate() + days);tự động xử lý các thay đổi DST. Và tôi phải sửa, những giây nhuận bị bỏ qua trong dấu thời gian của JS.
Stephan

4

Chỉnh sửa: Thay vì setTime()(hoặc setHours()) bạn có thể làm theo cách này:

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

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

Cũ:

Thay vì sử dụng, setTime()bạn có thể sử dụng setHours():

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

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

Xem JSFiddle ...


theo logic này, bạn cũng có thể thêm một ngày;)d.setDate(d.getDate() + 1);
Rivenfall

4

Mã rất đơn giản để thêm ngày trong ngày trong tập lệnh java.

var d = new Date();
d.setDate(d.getDate() + prompt('how many days you want to add write here'));
alert(d);


4

Có một phương thức setDategetDate , cho phép bạn làm một cái gì đó như thế này:

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

Nếu bạn muốn trừ cả một số ngày và định dạng ngày của bạn ở định dạng có thể đọc được, bạn nên xem xét việc tạo một DateHelperđối tượng tùy chỉnh trông giống như thế này:

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

(xem thêm Fiddle này )


4

Mở rộng nguyên mẫu trong javascript có thể không phải là một ý tưởng tốt , đặc biệt là trong các cơ sở mã chuyên nghiệp.

Những gì bạn muốn làm là mở rộng Datelớp bản địa :

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)

Theo cách này, nếu một ngày Javascript thực hiện một addDaysphương thức gốc , bạn sẽ không phá vỡ bất cứ điều gì.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.