Menambahkan tanggal dalam JavaScript

433

Saya perlu menambah nilai tanggal satu hari di JavaScript.

Misalnya, saya memiliki nilai tanggal 2010-09-11 dan saya harus menyimpan tanggal hari berikutnya dalam variabel JavaScript.

Bagaimana saya bisa meningkatkan tanggal dengan sehari?

Santanu
sumber
Apakah ini menjawab pertanyaan Anda? Tambahkan hari ke Tanggal JavaScript
Michael Freidgeim

Jawaban:

791

Tiga opsi untuk Anda:

1. Menggunakan objek JavaScript saja Date(tidak ada perpustakaan):

Jawaban saya sebelumnya untuk # 1 salah (bertambah 24 jam, gagal memperhitungkan transisi ke dan dari waktu musim panas; Manusia Pintar menunjukkan bahwa itu akan gagal pada 7 November 2010 di zona waktu Timur). Sebaliknya, jawaban Jigar adalah cara yang benar untuk melakukan ini tanpa perpustakaan:

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

Ini berfungsi bahkan untuk hari terakhir dalam sebulan (atau setahun), karena objek tanggal JavaScript pintar tentang rollover:

(Jawaban ini saat ini diterima, jadi saya tidak bisa menghapusnya. Sebelum diterima saya menyarankan kepada OP mereka menerima Jigar, tapi mungkin mereka menerima yang ini untuk item # 2 atau # 3 dalam daftar.)

2. Menggunakan MomentJS :

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

(Waspadalah yang addmemodifikasi instance yang Anda panggil, alih-alih mengembalikan instance baru, jadi today.add(1, 'days')akan memodifikasi today. Itu sebabnya kami mulai dengan op kloning aktif var tomorrow = ....)

3. Menggunakan DateJS , tetapi belum diperbarui dalam waktu yang lama:

var today = new Date(); // Or Date.today()
var tomorrow = today.add(1).day();
TJ Crowder
sumber
Tapi saya punya tanggal 2010-09-11 dalam variabel dengan menggunakan document.getElementById ("arrival_date"). Nilai, itu menunjukkan tanggal tidak valid
Santanu
1
@ santanu: Itu masalah yang sama sekali berbeda: Date parsing (mendapatkan tanggal dengan menafsirkan string). Jika format itu statis, Anda dapat menguraikannya sendiri dan memasukkan hasilnya ke dalam Datekonstruktor ( new Date(year, month, date)); lihat bagian 15.9.2.1 dari spesifikasi ; jika Anda ingin menerima berbagai format, pasti lihat DateJS .
TJ Crowder
1
@santanu: Cukup ikuti di atas: Beberapa browser mungkin berhasil mem-parsing format itu Date.parse(yang mengembalikan sejumlah milidetik yang bisa Anda masukkan kemudian new Date(ms)). Namun berhati-hatilah, itu bisa bervariasi dari peramban ke peramban. Sampai saat ini, implementasi dapat melakukan apa saja yang mereka inginkan Date.parse. Spesifikasi edisi 5 baru sekarang memiliki format minimum yang harus diterima, tetapi saya belum akan mengandalkan itu.
TJ Crowder
Saya hanya ingin menambahkan satu detik ke instance Date; ini bekerja untuk saya x = new Date(); x2 = new Date(x.getTime() + 1000), di mana 1000 adalah peningkatan milidetik.
berto
1
@piavgh: Tidak ada yang salah dengan solusi pertama, hanya bagaimana Anda menggunakannya. Dateobjek bisa berubah. Anda menyimpan objek yang sama Date tiga kali dalam array. Jika Anda ingin tiga Dateobjek berbeda , Anda harus membuat tiga objek: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);
Jigar Joshi
sumber
Tapi saya punya tanggal 2010-09-11 dalam variabel dengan menggunakan document.getElementById ("arrival_date"). Nilai, ini menunjukkan tanggal tidak valid
Santanu
1
@sanatu: Dalam hal ini Anda perlu memformat string dengan cara yang akan diterima browser. Chrome menerima new Date("2009-09-11")tetapi Firefox tidak. Saya pikir sebagian besar browser menerima new Date("2009/09/11")solusi yang mudah var arrivalDate = document.getElementById('arival_date').value; var dayAfter = new Date(arrival_date.replace(/-/g, '/')); dayAfter.setDate(dayAfter.getDate()+1);.
David Hedlund
5
Pendekatan yang lebih solid daripada mengganti -dengan /dan berharap bahwa browser akan menerimanya, akan membagi string menjadi beberapa bagian: 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);Perhatikan bahwa kami menggunakan di m-1sini, karena bulan javascript adalah nilai enum (Januari menjadi 0, bukan 1), dan d+1karena kami sedang melakukan penambahan sudah dalam tugas awal (itu akan secara otomatis mengoreksi untuk 29 Februari, dll)
David Hedlund
35

Tidak ada satu pun contoh dalam jawaban ini yang berfungsi pada hari penyesuaian Daylight Saving Time. Pada hari-hari itu, jumlah jam dalam sehari bukanlah 24 (mereka 23 atau 25, tergantung pada apakah Anda "melompat maju" atau "mundur".)

Fungsi javascript AddDays di bawah ini menyumbang waktu musim panas:

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

Berikut adalah tes yang saya gunakan untuk menguji fungsi:

    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());
CleverPatrick
sumber
33

Cara termudah adalah dengan mengkonversi ke milidetik dan tambahkan 1000 * 60 * 60 * 24 milidetik misalnya:

var tomorrow = new Date(today.getTime()+1000*60*60*24);
Sylvain Lecorné
sumber
Saya suka ini, aturan representasi integer.
exebook
Ini jawaban terbaik. Dapat menambah / mengurangi hari sebanyak yang diminta; hanya dengan mengalikan 1000*60*60*24xDaysToBeAdded
Khalil Khalaf
Atau,, new Date(+new Date() + 1000*60*60*24)tetapi sebenarnya mirip dengan getTime()/ setTime(), sungguh.
Polv
1
Jangan lakukan ini kecuali tanggal Anda berada di UTC atau zona waktu lain yang tidak memiliki waktu musim panas. Kalau tidak, selama 2 hari per tahun, itu akan memberikan hasil yang tidak terduga.
ItalyPaleAle
Satu new Date(Date.now()+1000*60*60*24);
kalimat
28

Besok dalam satu baris di JS murni tapi jelek !

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

Inilah hasilnya:

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

Pertama-tama Anda harus mengurai string Anda sebelum mengikuti saran orang lain:

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

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

Jika Anda ingin kembali dalam format yang sama lagi, Anda harus melakukannya "secara manual":

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

Tapi saya sarankan mendapatkan Date.js seperti yang disebutkan dalam balasan lain, yang akan membantu Anda banyak .

einarmagnus
sumber
7

Saya merasa bahwa tidak ada yang lebih aman daripada .getTime()dan .setTime(), jadi ini harus menjadi yang terbaik, dan berkinerja juga.

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

.setDate() untuk Tanggal tidak valid (seperti 31 +1) terlalu berbahaya, dan itu tergantung pada implementasi browser.

Polv
sumber
5

Mendapatkan 5 hari ke depan:

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)
}
fitodac
sumber
Mencoba jawaban di atas tetapi sia-sia. Kode Anda berfungsi seperti mantra. Terima kasih!
dimmat
4

Dua metode:

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: Mirip dengan metode sebelumnya

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

Dapatkan nilai string tanggal menggunakan metode dateObj.toJSON () Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON Potong tanggal dari yang dikembalikan nilai dan kemudian bertambah dengan jumlah hari yang Anda inginkan.

var currentdate = new Date();
currentdate.setDate(currentdate.getDate() + 1);
var tomorrow = currentdate.toJSON().slice(0,10);
phil
sumber
Date.toJSON menggunakan 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);
}

Contoh

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

Hasil

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
swirekx
sumber
Kode Anda tidak berfungsi. Saya sudah mencobanya dengan console.log () pertama dan mengatakan: dt.AddDays () bukan fungsi.
Adrian2895
1

Tidak sepenuhnya yakin apakah itu BUG (Diuji Firefox 32.0.3 dan Chrome 38.0.2125.101), tetapi kode berikut akan gagal di Brasil (-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+"");

Hasil:

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

Menambahkan satu Jam ke tanggal, akan membuatnya bekerja dengan sempurna (tetapi tidak menyelesaikan masalah).

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

Hasil:

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
Alan Weiss
sumber
1

Menghasilkan representasi string tanggal besok. Gunakan Date () baru untuk mendapatkan tanggal hari ini, tambahkan satu hari menggunakan Date.getDate () dan Date.setDate (), dan ubah objek Date menjadi string.

  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();
Gor
sumber
1

Menambahkan tahun tanggal dengan 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

Untuk berjaga-jaga jika seseorang ingin menambah nilai selain tanggal (hari)

d1jhoni1b
sumber
1

Melalui JS asli, untuk menambah satu hari Anda dapat melakukan hal berikut:

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

Pilihan lain adalah menggunakan momentperpustakaan:

const date = moment().add(14, "days").toDate()
Kiran Debnath
sumber
1
Tolong jelaskan apa yang kode ini lakukan. Tambahkan detail tentang cara mengatasi masalah OP.
Yash
1

Penambahan tanggal sadar zona waktu / siang hari untuk tanggal 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);
}
Peter Marklund
sumber