Tambahkan hari ke Tanggal JavaScript


1097

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

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.


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


@ 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.


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.


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.


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.


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.


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/


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


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

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

14

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

new Date(+yourDate - 30 *86400000)


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


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

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


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 .


8

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

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

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

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;

8

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

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

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.


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

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

6

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

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

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

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


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


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


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 )


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.