Tăng một ngày trong JavaScript


433

Tôi cần tăng giá trị ngày lên một ngày bằng JavaScript.

Ví dụ: tôi có giá trị ngày 2010-09-11 và tôi cần lưu trữ ngày của ngày tiếp theo trong một biến JavaScript.

Làm thế nào tôi có thể tăng một ngày một ngày?


Điều này có trả lời câu hỏi của bạn không? Thêm ngày vào Ngày JavaScript
Michael Freidgeim

Câu trả lời:


791

Ba lựa chọn cho bạn:

1. Chỉ sử dụng Dateđối tượng JavaScript (không có thư viện):

Câu trả lời trước đây của tôi cho # 1 là sai (đã thêm 24 giờ, không tính đến việc chuyển đổi sang và từ thời gian tiết kiệm ánh sáng ban ngày; Clever Human chỉ ra rằng nó sẽ thất bại với ngày 7 tháng 11 năm 2010 ở múi giờ phương Đông). Thay vào đó, câu trả lời của Jigar là cách chính xác để làm điều này mà không cần thư viện:

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

Điều này hoạt động ngay cả vào ngày cuối cùng của tháng (hoặc năm), vì đối tượng ngày JavaScript rất thông minh về cuộn qua:

(Câu trả lời này hiện đang được chấp nhận, vì vậy tôi không thể xóa nó. Trước khi được chấp nhận, tôi đã đề xuất với OP, họ chấp nhận Jigar's, nhưng có lẽ họ đã chấp nhận câu này cho các mục số 2 hoặc # 3 trong danh sách.)

2. Sử dụng MomentJS :

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

(Coi chừng addsửa đổi thể hiện mà bạn gọi nó, thay vì trả về một thể hiện mới, vì vậy today.add(1, 'days')sẽ sửa đổi today. Đó là lý do tại sao chúng ta bắt đầu với một bản sao nhân bản var tomorrow = ....)

3. Sử dụng DateJS , nhưng nó đã không được cập nhật trong một thời gian dài:

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

Nhưng tôi có ngày 2010-09-11 trong một biến bằng cách sử dụng document.getEuityById ("come_date"). Nó hiển thị ngày không hợp lệ
Santanu

1
@santanu: Đó là một vấn đề hoàn toàn khác: Phân tích ngày (lấy ngày bằng cách diễn giải một chuỗi). Nếu định dạng đó là tĩnh, bạn có thể tự phân tích nó và đưa kết quả vào hàm Datetạo ( new Date(year, month, date)); xem phần 15.9.2.1 của thông số kỹ thuật ; nếu bạn muốn chấp nhận một loạt các định dạng, chắc chắn hãy xem DateJS .
TJ Crowder

1
@santanu: Chỉ cần làm theo cách trên: Một số trình duyệt có thể phân tích thành công định dạng đó với Date.parse(trả về một số mili giây mà sau đó bạn có thể đưa vào new Date(ms)). Nhưng hãy cẩn thận, có thể thay đổi từ trình duyệt để trình duyệt. Cho đến gần đây, việc triển khai có thể làm bất cứ điều gì họ muốn Date.parse. Đặc điểm kỹ thuật phiên bản thứ 5 mới hiện có định dạng tối thiểu phải được chấp nhận, nhưng tôi chưa tính đến điều đó.
TJ Crowder

Tôi chỉ muốn thêm một giây vào một ví dụ Ngày; điều này làm việc cho tôi x = new Date(); x2 = new Date(x.getTime() + 1000), trong đó 1000 là gia số mili giây.
Berto

1
@piavgh: Không có gì sai với giải pháp đầu tiên, đó là cách bạn sử dụng nó. Dateđối tượng là đột biến. Bạn đang lưu trữ cùng một Date đối tượng ba lần trong mảng. Nếu bạn muốn có ba Dateđối tượng khác nhau , bạn phải tạo ba đối tượng: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);

Nhưng tôi có ngày 2010-09-11 trong một biến bằng cách sử dụng document.getEuityById ("come_date"). Nó hiển thị ngày không hợp lệ
Santanu

1
@sanatu: Trong trường hợp đó bạn cần định dạng chuỗi theo cách mà trình duyệt sẽ chấp nhận. Chrome chấp nhận new Date("2009-09-11")nhưng Firefox thì không. Tôi nghĩ rằng hầu hết các trình duyệt chấp nhận new Date("2009/09/11")vì vậy một giải pháp dễ dàng sẽ được var arrivalDate = document.getElementById('arival_date').value; var dayAfter = new Date(arrival_date.replace(/-/g, '/')); dayAfter.setDate(dayAfter.getDate()+1);.
David Hedlund

5
Một cách tiếp cận chắc chắn hơn thay thế -bằng /và hy vọng rằng các trình duyệt sẽ chấp nhận nó, sẽ chia chuỗi thành các phần: 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);Lưu ý rằng chúng tôi đang sử dụng m-1ở đây, vì tháng javascript là giá trị enum (tháng 1 là 0, không phải 1) và d+1bởi vì chúng tôi đang thực hiện tăng dần trong bài tập ban đầu (nó sẽ tự động sửa cho ngày 29 tháng 2, v.v.)
David Hedlund

35

Không có ví dụ nào trong câu trả lời này dường như hoạt động với các ngày điều chỉnh Giờ tiết kiệm ánh sáng ban ngày. Vào những ngày đó, số giờ trong một ngày không phải là 24 (chúng là 23 hoặc 25, tùy thuộc vào việc bạn đang "tiến về phía trước" hay "quay trở lại".)

Các tài khoản javascript AddDays dưới đây cho thời gian tiết kiệm ánh sáng ban ngày:

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

Dưới đây là các bài kiểm tra tôi đã sử dụng để kiểm tra chức năng:

    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

Cách dễ nhất là chuyển đổi sang mili giây và thêm 1000 * 60 * 60 * 24 mili giây, ví dụ:

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

Tôi yêu cái này, quy tắc đại diện số nguyên.
exebook

Đây là câu trả lời tốt nhất. Có thể tăng / giảm dễ dàng bao nhiêu ngày theo yêu cầu; chỉ bằng cách nhân 1000*60*60*24xDaysToBeAdded
Khalil Khalaf

Hoặc, new Date(+new Date() + 1000*60*60*24)nhưng nó thực sự tương tự như getTime()/ setTime(), thực sự.
Polv

1
Đừng làm điều này trừ khi ngày của bạn ở UTC hoặc múi giờ khác không có thời gian tiết kiệm ánh sáng ban ngày. Nếu không, trong 2 ngày mỗi năm, nó sẽ cho kết quả bất ngờ.
ItalyPaleAle

Một lót:new Date(Date.now()+1000*60*60*24);
aiyan

28

Ngày mai trong một dòng trong JS thuần túy nhưng thật xấu xí !

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

Đây là kết quả:

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

14

Trước tiên bạn cần phân tích chuỗi của mình trước khi làm theo đề xuất của người khác:

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

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

Nếu bạn muốn nó trở lại cùng định dạng một lần nữa, bạn sẽ phải thực hiện "thủ công":

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

Nhưng tôi khuyên bạn nên lấy Date.js như được đề cập trong các câu trả lời khác, điều đó sẽ giúp bạn rất nhiều .


7

Tôi cảm thấy rằng không có gì an toàn hơn .getTime().setTime(), vì vậy đây cũng là điều tốt nhất và hiệu quả.

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

.setDate() đối với Ngày không hợp lệ (như 31 + 1) quá nguy hiểm và tùy thuộc vào việc triển khai trình duyệt.


5

Bắt 5 ngày tiếp theo:

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

Đã thử các câu trả lời trên nhưng vô ích. Mã của bạn làm việc như một lá bùa. Cảm ơn!
dimmat

4

Hai phương pháp:

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: Tương tự như phương pháp trước

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


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

Thí dụ

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

Kết quả

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

Mã của bạn không hoạt động. Tôi đã thử nó với console.log () đầu tiên và nó nói: dt.AddDays () không phải là một hàm.
Adrian2895

1

Không hoàn toàn chắc chắn nếu đó là BUG (Đã kiểm tra Firefox 32.0.3 và Chrome 38.0.2125.101), nhưng đoạn mã sau sẽ thất bại ở Brazil (-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+"");

Kết quả:

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

Thêm một giờ vào ngày, sẽ làm cho nó hoạt động hoàn hảo (nhưng không giải quyết được vấn đề).

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

Kết quả:

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

Kết quả trong một chuỗi đại diện của ngày mai. Sử dụng Ngày mới () để có được ngày hôm nay, thêm một ngày bằng Date.getDate () và Date.setDate () và chuyển đổi đối tượng Ngày thành chuỗi.

  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

Ngày gia tăng của năm với 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

Chỉ trong trường hợp ai đó muốn tăng giá trị khác ngoài ngày (ngày)


1

Thông qua JS gốc, để thêm một ngày bạn có thể làm như sau:

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

Một tùy chọn khác là sử dụng momentthư viện:

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

1
Hãy giải thích những gì mã này làm. Thêm chi tiết về cách giải quyết vấn đề của OP.
Yash

1

Tăng thời gian nhận biết tiết kiệm múi giờ / ngày cho các ngày 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);
}
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.