Tambahkan hari ke Tanggal JavaScript

1097

Cara menambahkan hari ke saat ini Datemenggunakan JavaScript. Apakah JavaScript memiliki fungsi bawaan seperti .Net AddDay?

Ashesh
sumber

Jawaban:

1212

Anda dapat membuatnya dengan: -

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

Ini menangani penambahan bulan secara otomatis jika perlu. Sebagai contoh:

8/31 + 1 hari akan menjadi 9/1 .

Masalah dengan menggunakan setDatesecara langsung adalah bahwa itu adalah mutator dan hal semacam itu sebaiknya dihindari. ECMA melihat cocok untuk diperlakukan Datesebagai kelas yang bisa berubah daripada struktur yang tidak berubah.

AnthonyWJones
sumber
17
Sederhana:Date.prototype.addDays=function(d){return new Date(this.valueOf()+864E5*d);};
Duncan
27
@Duncan Anda yakin ini sama dengan yang di atas? Yang ini hanya menambah 24 jam, tetapi satu hari tidak selalu 24 jam . Saya kira pertanyaannya adalah bagaimana cara menambah bagian tanggal dengan 1 hari, tanpa mengubah bagian waktu.
Tamás Bolvári
88
864E5untuk beberapa alasan saya lebih suka menulis 24*60*60dalam kode saya :)
Mars Robertson
62
Guys, jangan gunakan metode penambahan 864E5 karena ini tidak mengambil perbedaan daylight saving di mana hari bisa 23 atau 25 jam.
sbrbot
12
Bagi Anda yang khawatir tentang Daylight Savings - Jangan. Algoritma ini mengubah tanggal yang mendasarinya, bukan bagaimana tanggal ditafsirkan. DST diterapkan pada pengambil dan penentu tanggal - getter mengurangi satu jam di musim panas, dan pembuat set untuk menambahkan jam itu kembali selama musim panas untuk menormalkan waktu. Tetapi hanya ketika menggunakan jam absolut - jam relatif tidak perlu ditafsirkan. Inilah sebabnya matematika tanggal bekerja. IMHO ...
Gerard ONeill
755

Jawaban yang benar :

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

Jawaban yang salah :

Jawaban ini terkadang memberikan hasil yang benar tetapi sangat sering mengembalikan tahun dan bulan yang salah. Satu-satunya waktu jawaban ini bekerja adalah ketika tanggal yang Anda tambahkan hari akan memiliki tahun dan bulan saat ini.

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

Bukti / Contoh

Lihat JsFiddle ini

sparebytes
sumber
@ bzlm, Ya pada dasarnya sama. Itu hanya tidak mengubah prototipe Tanggal. Saya juga ingin menunjukkan kekurangan dalam jawaban utama.
sparebytes
Jawaban yang diterima diedit dua minggu yang lalu untuk menunjukkan kekurangannya. Apakah menurut Anda perlu pengeditan lebih lanjut? Jika ya, bagaimana caranya?
bzlm
7
@ bzlm: Ya, saya percaya catatan itu harus berbunyi "pendekatan ini gagal jika tanggal 'dari' tidak di tahun atau bulan yang sama dengan tanggal saat ini ". Saya masih khawatir bahwa pengguna akan melirik jawabannya dan tidak membaca peringatan karena tidak menonjol. Terima kasih.
sparebytes
3
Saya pikir, bahkan jika ini berhasil, itu tidak benar. Tidak ada konstruktor untuk Tanggal: var result = Tanggal baru (tanggal); , lihat http://www.w3schools.com/js/js_dates.asp . Bahkan jika ini biasanya berhasil, kadang-kadang dapat menyebabkan hasil yang salah karena konversi ke string dan sebaliknya. Itu harus var result = Date baru (date.getTime ());
Marcin
2
@AnkitBalyan, Lihat jawaban lain. Ini mungkin tidak berfungsi dengan benar karena Daylight Savings Time
sparebytes
188
var today = new Date();
var tomorrow = new Date();
tomorrow.setDate(today.getDate()+1);

Hati-hati, karena ini bisa rumit. Saat menetapkan "besok", itu hanya berfungsi karena nilainya saat ini cocok dengan tahun dan bulan untuk "hari ini". Namun, pengaturan ke nomor tanggal seperti "32" biasanya masih berfungsi dengan baik untuk memindahkannya ke bulan berikutnya.

Joel Coehoorn
sumber
1
Ya? Tapi apa ini? (berlari pada 31 Maret 2010): hari ini = Tanggal baru (); besok = Tanggal baru (); besok.setDate (today.getDate () +1); alert (besok.getMonth ()); Mengatakan "3". waspada (besok); benar ... Kenapa ???
d -_- b
12
@sims bulan diindeks 0. Bulan 3 adalah April
Joel Coehoorn
7
Mengapa perlu membuat 2 objek tanggal yang terpisah? Mengapa tidak hanya menggunakan objek tanggal yang sama: var d = new Date(); d.setDate( d.getDate() + 1 );?
Joseph Silber
8
Pendekatan ini tidak berhasil selama bertahun-tahun. Jika tanggal mulai Anda dari beberapa tahun yang lalu, getDate()kembalikan hari tahun itu . Kemudian, panggilan setDatemenentukan hari di tahun berjalan . Jadi ini BUKAN solusi umum yang baik. Jawaban @ AnthonyWJones sebenarnya bekerja dengan benar.
Drew Noakes
3
@ DrewNoakes — pernyataan Anda bahwa itu tidak berhasil selama bertahun-tahun adalah salah. getDate mengembalikan hari di bulan itu, bukan "hari di tahun itu". Misalnya var d = new Date(2015,11,30);d.setDate(d.getDate() + 370)memberi 3 Jan 2017 yang melintasi 2 tahun.
RobG
124

Solusi sederhana saya adalah:

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

solusi ini tidak memiliki masalah dengan waktu musim panas. Juga, seseorang dapat menambahkan / mengganti offset apa pun selama bertahun-tahun, bulan, hari, dll.

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

adalah kode yang benar.

sbrbot
sumber
13
Catatan: waktu ini disetel ulang menjadi 00:00:00 (bisa menjadi masalah atau tidak)
Álvaro González
Tidak berfungsi pada hari terakhir bulan apa pun, seperti yang Anda katakan. Membuat ini tidak dapat digunakan pada 12 hari dalam setahun. Kedengarannya seperti mimpi buruk untuk di-debug !!!
Drew Noakes
6
Tidak Drew, ini bisa digunakan untuk semua hari dalam setahun. Anda dapat menempatkan tanggal offset lebih besar dari 31 atau bulan offset lebih besar dari 12 dan fungsi ini akan menghitung ulang sebagai hari di bulan berikutnya atau bulan di tahun berikutnya. Jadi misalnya: nextday = Tanggal baru (oldDate.getFullYear (), oldDate.getMonth (), oldDate.getDate () + 40); adalah kode yang sangat baik.
sbrbot
ada getMonth () + 22 - apa yang menurut Anda akan berhasil !?
sbrbot
1
Saya Setuju, gunakan cara ini. Kami baru saja mendapatkan bug karena penghematan waktu siang hari karena kami menggunakan setDate.
Jelle
95

Jawaban ini sepertinya membingungkan bagi saya, saya lebih suka:

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

getTime () memberi kita milidetik sejak 1970, dan 86400000 adalah jumlah milidetik dalam sehari. Karenanya, ms berisi milidetik untuk tanggal yang diinginkan.

Menggunakan konstruktor milidetik memberikan objek tanggal yang diinginkan.

Jason
sumber
46
Solusi ini tidak memperhitungkan penghematan siang hari. Jadi, misalnya, ini akan mengembalikan tanggal yang sama, 23 jam kemudian: new Date(new Date('11/4/2012').getTime() + 86400000)
Noah Harrison
6
@NoahMiller Masalah yang Anda kemukakan mungkin fitur bukan bug! Menambahkan 24 jam per hari terkadang adalah hal yang tepat untuk dilakukan, dengan tujuan mengetahui waktu yang dihasilkan berdasarkan DST. Tanggal di mana contoh Anda dikembalikan memiliki nilai waktu 11 malam pada tanggal 4 November yang merupakan 24 jam kemudian pada hari tertentu. Poster asli bertanya tentang datetime yang tampaknya menunjukkan beberapa keinginan untuk waktu yang tepat dalam sehari. Jawaban ini benar jika Anda berada dalam kasus ketika tujuan Anda adalah waktu 24 jam kemudian.
Andy Novocin
3
Saya setuju Nuh, var d2 = Tanggal baru (d1.valueOf () + 24 * 60 * 60 * 1000) melakukan apa yang dikatakannya, menambahkan nilai kutu sehari penuh ke tanggal.
Corey Alix
6
Ini benar-benar tepat untuk beberapa kasus (misalnya untuk cookie 1 hari) dan solusi yang lebih sederhana daripada kebanyakan yang lain. Saya tidak mengerti mengapa ada begitu banyak downvotes dan sedikit upvotes: /
Matmarbon
48

Mencoba

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

Menggunakan setDate () untuk menambahkan tanggal tidak akan menyelesaikan masalah Anda, coba tambahkan beberapa hari ke bulan Februari, jika Anda mencoba menambahkan hari baru ke dalamnya, itu tidak akan menghasilkan apa yang Anda harapkan.

sufyan.shoaib
sumber
26
Tidak, ini tidak boleh ditandai sebagai jawaban yang benar karena solusi ini mengasumsikan bahwa setiap hari memiliki 24 * 60 * 60 * 1000 detik tetapi tidak (penghematan siang hari)!
sbrbot
Adakah bukti tentang masalah 'Feb' dengan setDate()? Apakah ini: stackoverflow.com/questions/5497637/...
nobar
9
+1 Ini HARUS ditandai sebagai jawaban yang benar. Saya percaya bahwa "penghematan siang hari" adalah tentang presentasi dan bukan tentang nilai , yang hanya jumlah milidetik. Dari nilai -titik pandang - hari adalah jumlah CONST dari millisecs, sementara dari segi presentasi mungkin bervariasi.
dikecewakan
1
@ disfated — ini bukan jawaban yang benar. Hari kehabisan daylight saving memiliki 25 jam, tetapi metode ini hanya menambahkan 24 sehingga tanggalnya akan sama. Menggunakan 24 jam untuk mewakili satu hari berfungsi jika metode UTC digunakan sebagai gantinya, tetapi mengapa repot ketika menggunakan setDate lebih nyaman? ;-)
RobG
38

Hanya menghabiskan waktu bertahun-tahun untuk mencari tahu apa yang terjadi dengan tahun yang tidak ditambahkan ketika mengikuti contoh utama di bawah ini.

Jika Anda hanya ingin menambahkan n hari ke tanggal yang Anda miliki, yang terbaik adalah:

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

atau versi jangka panjang

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

Ini hari ini / besok membingungkan. Dengan mengatur tanggal saat ini ke variabel tanggal baru Anda, Anda akan mengacaukan nilai tahun. jika Anda bekerja dari tanggal semula, Anda tidak akan melakukannya.

Pengguru rum
sumber
7
Membaca semua jawaban di sekitar sampai saya menemukan permata ini di sini Sekarang masuk akal. Luar biasa bahwa hal hari ini / esok disalin di hampir semua jawaban, ketika itu tidak masuk akal sama sekali dan itu bukan "untuk kewaspadaan dan kejelasan" seperti yang dikatakan penulis dalam jawaban yang paling banyak dipilih - dalam komentar yang paling tinggi -, itu membingungkan dan merupakan praktik buruk dan salah
Cesc
23

Jika Anda bisa, gunakan moment.js . JavaScript tidak memiliki metode tanggal / waktu asli yang sangat bagus. Berikut ini adalah contoh sintaks 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>

Referensi: http://momentjs.com/docs/#/manipulating/add/

pengguna2910265
sumber
1
@ kpull1 si penanya tidak membatasi domain solusi dengan menanyakan apakah ada solusi bawaan.
user2910265
4
Catatan modern: Moment.js sangat berat untuk ditambahkan untuk tujuan sekecil itu. Ini beberapa ratus KB, dan tidak ramah webpack di luar kotak.
Joshua Comeau
1
Perpustakaan pilihan kami adalah date-fns. Webpack-friendly, cepat, dan memperlakukan Tanggal tidak berubah.
Freewalker
1
@LukeWilliams belum pernah mendengar tanggal-fns sampai sekarang. akan memeriksanya. Terima kasih.
user2910265
2
@JoshuaComeau Jika Anda mengunduhnya dari cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.3/moment.min.js , ia membutuhkan disk pada 53.248 byte. Saya membayangkan itu adalah seluruh lilin, tetapi saya tidak tahu. Bagaimanapun, terserahlah. Itu bukan masalah besar.
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);

Serge
sumber
2
Upvote untuk tidak memerlukan variabel tanggal menengah.
Jeff Lowery
ini adalah jawaban terbaik karena tidak memiliki mutasi
knocte
Tidak setiap hari memiliki 24 jam, gagal untuk DST dan melompat detik.
Stephan
19

Saya membuat ekstensi ini tadi malam:
Anda dapat memberikan nilai positif atau negatif;

contoh:

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;
}
mark.nino.chua
sumber
7
Metode .addDays () tidak berfungsi untuk tanggal yang melampaui batas waktu musim panas.
mskfisher
1
Ini adalah salah satu jawaban yang lebih baik di sini karena Anda (benar) menggunakan jumlah mili sejak epoc untuk mewakili tanggal / waktu, dan menambahkan jumlah mili untuk penyesuaian ... Mengapa kemudian Anda tidak menyimpannya untuk "addMonths"! ? Dan mengapa tidak menambahkan tahun? Apakah kamu bosan?
Robin
Selain bulan, periode waktu dapat direpresentasikan dengan angka statis. Tapi bulan bisa empat panjang yang berbeda. Selain itu, setiap jangka waktu dari Hari dan lebih tinggi dapat memiliki panjang variabel di DST, jadi Anda tidak dapat menggunakan tambahan berbasis waktu lagi tanpa tingkat kerumitan lain. Saya menambahkan addYears (), dan saya memperbaiki addMonths ().
Suamere
14

Tanpa menggunakan variabel kedua, Anda dapat mengganti 7 dengan x hari berikutnya:

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

untuk mengurangi 30 hari gunakan (24 jam = 86400000 ms)

new Date(+yourDate - 30 *86400000)

Kamil Kiełczewski
sumber
Ketika mencoba menghitung waktu tanggal selalu ingat waktu tanggal itu berdasarkan milidetik dalam ilmu komputer, ( en.wikipedia.org/wiki/System_time#Retrieving_system_time ) Tanggal baru (+ tanggal Anda + 30 * (24 * 60 * 60 * 1000))
Ashraf Abusada
13

Solusi paling sederhana.

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

ampachts
sumber
Saya pikir ini adalah solusi terbaik. Jika kita memperluas kelas Date, maka lebih masuk akal jika instance Date sendiri diperbarui.
Porlune
10

Terima kasih Jason atas jawaban Anda yang berfungsi seperti yang diharapkan, berikut adalah campuran dari kode Anda dan format praktis dari AnthonyWJones:

Date.prototype.addDays = function(days){
    var ms = new Date().getTime() + (86400000 * days);
    var added = new Date(ms);
    return added;
}
Olivier
sumber
6
Itu tidak memperhitungkan penghematan siang hari ketika ada lebih atau kurang dari 86400000 detik dalam sehari dan dapat mengakibatkan kesalahan logis (bug program) dalam kode Anda.
sbrbot
Terkadang itu dibutuhkan. API eBay memiliki lelang x-hari yang berbasis 24 jam sehingga barang Anda akan berakhir pada waktu yang berbeda dari yang naik jika status DST berubah pada pertengahan lelang. Dalam hal ini Anda perlu menggunakan fungsi jenis ini untuk menghindari kesalahan logis.
Andy Novocin
10

Terlambat ke pesta, tetapi jika Anda menggunakannya jQuerymaka ada plugin yang sangat bagus bernama Moment:

http://momentjs.com/

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

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

Dan banyak hal baik lainnya di sana!

Sunting: referensi jQuery dihapus berkat komentar aikeru

RemarkLima
sumber
1
saat tidak perlu jQuery :)
aikeru
Bahkan lebih baik dalam hal ini !!
RemarkLima
1
Ya, setelah menghabiskan waktu dengan Plain ol 'JS terlalu lama, saya menggunakan Moment, dan itu hanya berfungsi (tm)!
caseyamcl
Mengapa Anda ingin menggunakan plugin ketika beberapa baris JS akan lakukan?
frenchie
@frenchie karena, apa yang dimulai dengan beberapa baris JS dan karena jelas aplikasi Anda memanipulasi informasi terkait hari, tanggal dan waktu, maka akan segera ada beberapa baris JS, maka Anda akan diminta untuk melokalisasi aplikasi di seluruh 12 bahasa dan zona waktu dan Anda berharap memulai dengan sesuatu seperti saat;)
RemarkLima
10

Solusi yang dirancang untuk operator pipa :

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

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

  return result;
};

Pemakaian:

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

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

Jika Anda membutuhkan lebih banyak fungsi, saya sarankan melihat ke perpustakaan tanggal-fns .

sdgfsdh
sumber
8

Lama saya tahu, tetapi kadang-kadang saya suka ini:

function addDays(days) {
    return new Date(Date.now() + 864e5 * days);
}
Todd
sumber
2
Yang ini paling masuk akal bagi saya. Ini sederhana, elegan dan tidak jatuh berdoa untuk masalah bergerak selama beberapa bulan / tahun.
uadrive
1
Jawaban paling sederhana disajikan. Membangun ini, prototipe 'addDays' akan menjadi sebagai berikut:Date.prototype.addDays = function(days) {return new Date(this.getTime() + (864e5 * days));};
CrazyIvan1974
Tidak setiap hari memiliki 24 jam, gagal untuk DST dan melompat detik.
Stephan
8

Saya memiliki masalah dengan penghematan waktu siang hari dengan solusi yang diusulkan.

Dengan menggunakan getUTCDate/ setUTCDatesebaliknya, saya memecahkan masalah saya.

// 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;
}
Joshua Comeau
sumber
8

Anda dapat menggunakan JavaScript, tidak perlu 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;
Rohit.007
sumber
8

Prototipe generik tanpa variabel, ini berlaku pada nilai Tanggal yang ada:

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

Dokumen mozilla untuk setDate () tidak menunjukkan bahwa ia akan menangani skenario akhir bulan. Lihat https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date

Atur tanggal()

  • Tetapkan hari pada bulan tersebut (1-31) untuk tanggal yang ditentukan sesuai dengan waktu setempat.

Itu sebabnya saya menggunakan setTime () ketika saya perlu menambahkan hari.

Blake Mills
sumber
Saya akan menautkan ke dokumen ECMAScript, tetapi dirilis dalam PDF; (
Blake Mills
1
Re " mozilla docs untuk setDate () tidak mengindikasikan bahwa ia akan menangani skenario akhir bulan ". "Docs" telah diperbarui jadi sekarang mereka lakukan. ;-)
RobG
7

Sesederhana ini:

new Date((new Date()).getTime() + (60*60*24*1000));
Dila Gurung
sumber
2
Meskipun ini menambah hari UTC, ia menggunakan metode lokal dan tidak memungkinkan untuk hari-hari lokal yang tidak 24 jam, yang terjadi ketika zona waktu mengimbangi perubahan (misalnya, masuk dan keluar dari penghematan siang hari).
RobG
6

Saya kira saya akan memberikan jawaban juga:
Secara pribadi, saya suka mencoba menghindari deklarasi variabel serampangan, panggilan metode, dan panggilan konstruktor, karena semuanya mahal pada kinerja. (tentu saja, dengan alasan)
saya akan meninggalkan ini hanya sebagai komentar di bawah Jawaban yang diberikan oleh @AnthonyWJones tetapi berpikir lebih baik dari itu.

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

Di atas akan menghormati DST. Berarti jika Anda menambahkan beberapa hari yang melewati DST, waktu (jam) yang ditampilkan akan berubah untuk mencerminkannya.
Contoh:
2 Nov 2014 02:00 adalah akhir dari 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

Jika Anda ingin mempertahankan waktu melintasi DST (jadi 10:30 masih akan menjadi 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;
};

Jadi, sekarang kamu sudah ...

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
Duncan
sumber
6

Tidak, javascript tidak memiliki fungsi bawaan, tetapi Anda dapat menggunakan baris kode sederhana

timeObject.setDate(timeObject.getDate() + countOfDays);
Vahag Chakhoyan
sumber
5

Saya menggunakan sesuatu seperti:

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

Bekerja dengan menghemat waktu:

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

Bekerja dengan tahun baru:

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

Itu dapat parametrized:

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);
}
kpull1
sumber
4

Saya menggunakan solusi berikut.

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

Date memiliki konstruktor yang menerima int. Argumen ini mewakili total milidetik sebelum / setelah 1 Januari 1970. Argumen ini juga memiliki metode setTime yang melakukan hal yang sama tanpa membuat objek Date yang baru.

Apa yang kami lakukan di sini adalah mengonversi hari menjadi milidetik dan menambahkan nilai ini ke nilai yang diberikan oleh getTime. Akhirnya, kami memberikan hasilnya kepada konstruktor Date (milidetik) atau metode setTime (milidetik).

Vakhtang
sumber
Tidak setiap hari memiliki 24 jam, gagal untuk DST dan melompat detik.
Stephan
Stephan, apakah ada akun perpustakaan lain untuk itu?
Vakhtang
now.setDate(now.getDate() + days);secara otomatis menangani perubahan DST. Dan saya harus memperbaiki, lompatan detik diabaikan dalam cap waktu JS.
Stephan
4

Sunting: Alih-alih setTime()(atau setHours()) Anda bisa melakukannya dengan cara ini:

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

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

Tua:

Alih-alih menggunakan setTime()Anda dapat menggunakan setHours():

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

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

Lihat JSFiddle ...

spaark
sumber
mengikuti logika ini, Anda juga dapat menambahkan satu hari;)d.setDate(d.getDate() + 1);
Rivenfall
4

Kode yang sangat sederhana untuk menambahkan tanggal dalam skrip java.

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

Rana Aalamgeer
sumber
4

Ada metode setDate dan getDate , yang memungkinkan Anda melakukan sesuatu seperti ini:

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

Jika Anda ingin mengurangi beberapa hari dan memformat tanggal Anda dalam format yang dapat dibaca manusia, Anda harus mempertimbangkan untuk membuat DateHelperobjek kustom yang terlihat seperti ini:

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

(Lihat juga Fiddle ini )

John Slegers
sumber
4

Memperluas prototipe dalam javascript mungkin bukan ide yang baik , terutama dalam basis kode profesional.

Apa yang ingin Anda lakukan adalah memperluas Datekelas asli :

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)

Dengan cara ini, jika suatu hari Javascript mengimplementasikan addDaysmetode asli , Anda tidak akan merusak apa pun.

Creaforge
sumber