Kurangi hari dari tanggal dalam JavaScript

603

Adakah yang tahu cara mudah untuk berkencan (mis. Hari ini) dan kembali ke X hari?

Jadi, misalnya, jika saya ingin menghitung tanggal 5 hari sebelum hari ini.

Jonhobbs
sumber
4
Saya menemukan masalah dalam menggunakan jawaban yang diterima. Tampaknya menggunakan nilai negatif di setDate () tidak berfungsi seperti yang diharapkan. Lihat stackoverflow.com/a/9037132/792287 untuk solusi (lebih baik?) Yang lain.
vandiedakaf
5
Kemungkinan rangkap: stackoverflow.com/questions/1187824/…
Anderson Green
Periksa github.com/viebig/datetreta
Guilherme Viebig

Jawaban:

962

Coba sesuatu seperti ini:

 var d = new Date();
 d.setDate(d.getDate()-5);

Perhatikan bahwa ini memodifikasi objek tanggal dan mengembalikan nilai waktu dari tanggal yang diperbarui.

var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 5);

document.write('<br>5 days ago was: ' + d.toLocaleString());

Stephen Wrighton
sumber
9
Output dari itu memberi saya string panjang bilangan bulat. Adakah cara untuk memformatnya menjadi 14/05/2012?
user525146
162
Mengingat bahwa ini di bagian atas google, saya pikir saya akan menjawab komentar di atas: new Date(new Date().setDate(new Date().getDate()-5))- itu akan menjadi 5 hari yang lalu. Dalam contoh jawaban, berikan ke tanggal baru untuk mendapatkan objek kencan. Jadi new Date(d)apa yang kamu inginkan.
Jesse
8
Masalah dengan ini adalah Anda dapat menghasilkan 00 yang bukan nilai yang valid untuk kencan.
DominicM
24
setDate(-1)akan menetapkan tanggal ke hari terakhir bulan itu
Peter
5
@ user525146 bertanya bagaimana memformat nomor, bukan nomornya. Tidak perlu untuk merendahkan jawaban. Untuk memformat nomor, gunakan salah satu Tanggal toStringmetode seperti toISOString, toDateString, dll
Bad Request
83
var dateOffset = (24*60*60*1000) * 5; //5 days
var myDate = new Date();
myDate.setTime(myDate.getTime() - dateOffset);

Jika Anda melakukan banyak manipulasi tanggal headachy di seluruh aplikasi web Anda, DateJS akan membuat hidup Anda lebih mudah:

http://simonwillison.net/2007/Dec/3/datejs/

karim79
sumber
23
ini kasus tepi, tetapi ini bisa gagal di sekitar awal / akhir waktu musim panas. Anda tidak mengurangi 5 hari, tetapi 5 * 24 jam. hari pertama waktu musim panas hanya 23 jam, dan yang terakhir adalah 25 jam. biasanya tidak masalah, tapi itu sesuatu yang perlu dipertimbangkan.
Kip
11
@Kip Saya benci waktu musim panas ... dan zona waktu. Kita semua harus pindah ke GMT.
cwallenpoole
6
@cwallenpoole bukan untuk memecahkan gelembung Anda, tetapi mereka menggunakan DST bahkan di Greenwich. Jadi, jika Anda benar-benar ingin menggunakan GMT, Anda dibatasi untuk Islandia dan beberapa negara Afrika Barat.
Kip
1
Masalah dengan metode ini, adalah bahwa itu tidak bekerja dengan tahun baru dll.
Daniel Williams
4
@danielWilliams Bagaimana ini tidak bekerja dengan tahun baru? getTime()dan setTime()milidetik sejak zaman. Seharusnya tidak masalah jika waktu melewati batas tahun.
Mashmagar
52

Bunyinya seperti ini:

var d = new Date(); // today!
var x = 5; // go back 5 days!
d.setDate(d.getDate() - x);
Chris Nielsen
sumber
Output dari itu memberi saya string panjang bilangan bulat. Adakah cara untuk memformatnya menjadi 14/05/2012?
user525146
7
Nilai kembalinya d.setDate memang merupakan nilai integer. Namun, Anda mungkin sebenarnya tidak tertarik dengan nilai pengembalian pada titik ini, karena nilai aktual "d" telah dimodifikasi. Pertanyaan Anda sebenarnya adalah sekarang bagaimana memformat tanggal Anda, yang sekarang dalam "d" dan bukan nilai pengembalian setDate sama sekali. (Yah, itu sebenarnya adalah nilai balik, tapi itu bukan tanggal pada titik itu dan saya tidak ingin membingungkan Anda - cukup gunakan d, itu akan lebih cepat). Untuk memformat tanggal, Anda menginginkan metode d.getMonth (), d.getFullYear (), dan d.getDate (). Anda ingin menambahkan satu ke d.getMonth (), karena Jan adalah 0.
Chris Nielsen
2
Sebagai metode sederhana: function getDaysAgo(b){var a=new Date;a.setDate(a.getDate()-b);return a};maka cukupvar daysAgo45 = getDaysAgo(45);
SpYk3HH
@MiroKrsjak Tentu saja ini berfungsi jika Anda melewati akhir / awal bulan. Mengapa itu tidak berhasil?
Chris Nielsen
23

Saya perhatikan bahwa getDays + X tidak berfungsi melebihi batas hari / bulan. Menggunakan getTime berfungsi selama kencan Anda tidak sebelum tahun 1970.

var todayDate = new Date(), weekDate = new Date();
weekDate.setTime(todayDate.getTime()-(7*24*3600000));
awjr
sumber
3
Saya perhatikan hal yang sama. Saya lebih terkejut belum, atau saya kehilangan sesuatu?
Sean Glover
11
Ini tidak benar, Tanggal baru (). SetDate (-1) akan memberi Anda hari terakhir bulan sebelumnya.
zbrunson
2
Ini juga salah di sekitar tepi kasus awal / akhir waktu musim panas. Pendekatan Anda mengurangi 7 * 24 jam, dengan asumsi bahwa setiap hari memiliki 24 jam. Hari pertama DST hanya 23 jam, dan hari terakhir adalah 25 jam. setDate (getDate () - 7) tidak memiliki masalah ini.
Kip
1
getTime bekerja di luar waktu universal. Jadi akan dengan benar mengurangi waktu 7 hari dari objek Date. Saat Anda mengonversinya menjadi string di zona waktu yang ditentukan, itu akan menunjukkan waktu untuk zona itu dengan benar.
awjr
Berhati-hatilah pada hari perubahan waktu. Ketika kami jatuh kembali pada musim gugur, hari itu memiliki 25 jam, jadi mengurangi 24 jam dari tengah malam akan mendaratkan Anda di hari yang sama. Tetapi teknik ini (mengurangi milidetik) AKAN bekerja jika Anda mengakhiri hari setelah setiap operasi ke tengah malam terdekat. Anda dapat melakukannya dengan pertama-tama menambahkan 12 jam, kemudian mengatur jam ke nol.
Magmatik
18

dapatkan moment.js. Semua anak keren menggunakannya. Ini memiliki lebih banyak opsi pemformatan, dll. Di mana

var n = 5;
var dateMnsFive = moment(<your date>).subtract(n , 'day');

Pilihan! Konversi ke JS Date obj untuk Angular binding.

var date = new Date(dateMnsFive.toISOString());

Pilihan! Format

var date = dateMnsFive.format("YYYY-MM-DD");
Kentonbmax
sumber
dengan memasukkan tanggal Anda ke dalam momen, Anda akan mulai mendapatkan peringatan. Peringatan penghentian: nilai yang diberikan tidak dalam format RFC2822 atau ISO yang diakui. konstruksi saat jatuh kembali ke js Date (), yang tidak dapat diandalkan di semua browser dan versi. Format tanggal non RFC2822 / ISO tidak disarankan dan akan dihapus dalam rilis utama mendatang. Silakan merujuk ke momentjs.com/guides/#/warnings/js-date untuk info lebih lanjut.
Beralih
13

Saya membuat prototipe ini untuk Date sehingga saya bisa memberikan nilai negatif untuk mengurangi hari dan nilai positif untuk menambah hari.

if(!Date.prototype.adjustDate){
    Date.prototype.adjustDate = function(days){
        var date;

        days = days || 0;

        if(days === 0){
            date = new Date( this.getTime() );
        } else if(days > 0) {
            date = new Date( this.getTime() );

            date.setDate(date.getDate() + days);
        } else {
            date = new Date(
                this.getFullYear(),
                this.getMonth(),
                this.getDate() - Math.abs(days),
                this.getHours(),
                this.getMinutes(),
                this.getSeconds(),
                this.getMilliseconds()
            );
        }

        this.setTime(date.getTime());

        return this;
    };
}

Jadi, untuk menggunakannya saya cukup menulis:

var date_subtract = new Date().adjustDate(-4),
    date_add = new Date().adjustDate(4);
Rob Dawley
sumber
2
Anda dapat menggunakan d.setDate(d.getDate() + days)nilai positif dan negatif selama berhari - hari untuk menambah dan mengurangi hari. Dan itu harus bekerja pada instance (seperti metode Date lainnya), tidak membuat dan mengembalikan salinan.
RobG
13

Beberapa solusi yang ada sudah dekat, tetapi tidak persis seperti yang saya inginkan. Fungsi ini berfungsi dengan nilai positif atau negatif dan menangani kasus batas.

function addDays(date, days) {
    return new Date(
        date.getFullYear(),
        date.getMonth(),
        date.getDate() + days,
        date.getHours(),
        date.getMinutes(),
        date.getSeconds(),
        date.getMilliseconds()
    );
}
Joel Fillmore
sumber
2
apakah 'tumpah' ke bulan depan jika saya menggunakan metode ini untuk menambah 20 hari menjadi tanggal 15 bulan ini? Sepertinya tidak.
Bora
2
@ Bor - ya, itu benar menambah bulan jika perlu. Misalnya, menambahkan 20 hari hingga 15 Agustus: addDays (Tanggal baru (2015, 07, 15), 20) akan mengembalikan "Jumat 04 Sep 2015 00:00:00 GMT-0700 (PDT)"
Joel Fillmore
12

Saya suka mengerjakan matematika dalam milidetik. Jadi gunakanDate.now()

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds

dan jika Anda suka diformat

new Date(newDate).toString(); // or .toUTCString or .toISOString ...

CATATAN: Date.now()tidak berfungsi di browser yang lebih lama (mis. IE8 saya pikir). Polyfill di sini .

PEMBARUAN Juni 2015

@socketpair menunjukkan kecerobohan saya. Seperti yang dia katakan, "Suatu hari dalam setahun memiliki 23 jam, dan beberapa 25 karena aturan zona waktu".

Untuk memperluasnya, jawaban di atas akan memiliki ketidakakuratan penghematan cahaya siang hari dalam kasus di mana Anda ingin menghitung LOKAL hari 5 hari yang lalu di zona waktu dengan perubahan daylightaving dan Anda

  • anggap (salah) itu Date.now() memberi Anda LOKAL sekarang waktu sekarang, atau
  • penggunaan .toString()yang mengembalikan tanggal lokal dan karenanya tidak sesuai dengan Date.now()tanggal dasar dalam UTC.

Namun, ini berfungsi jika Anda mengerjakan semua matematika di UTC, mis

A. Anda menginginkan tanggal UTC 5 hari yang lalu dari SEKARANG (UTC)

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds UTC
new Date(newDate).toUTCString(); // or .toISOString(), BUT NOT toString

B. Anda mulai dengan tanggal dasar UTC selain "sekarang", menggunakan Date.UTC()

newDate = new Date(Date.UTC(2015, 3, 1)).getTime() + -5*24*3600000;
new Date(newDate).toUTCString(); // or .toISOString BUT NOT toString
poshest
sumber
3
Ini tidak tepat. Suatu hari dalam setahun memiliki 23 jam, dan beberapa 25 karena aturan zona waktu.
socketpair
Saya akan khawatir tentang kondisi kegagalan ketika ada detik kabisat ... jadi mungkin tidak baik untuk kode kritis.
robocat
12

Saya menemukan masalah dengan metode getDate () / setDate () adalah terlalu mudah mengubah semuanya menjadi milidetik, dan sintaksisnya terkadang sulit untuk saya ikuti.

Alih-alih saya suka bekerja dengan fakta bahwa 1 hari = 86.400.000 milidetik.

Jadi, untuk pertanyaan khusus Anda:

today = new Date()
days = 86400000 //number of milliseconds in a day
fiveDaysAgo = new Date(today - (5*days))

Bekerja seperti pesona.

Saya menggunakan metode ini sepanjang waktu untuk melakukan perhitungan 30/60/365 hari bergulir.

Anda dapat dengan mudah memperkirakan ini untuk membuat satuan waktu selama berbulan-bulan, bertahun-tahun, dll.

Jonathan Bechtel
sumber
11

pisahkan tanggal Anda menjadi beberapa bagian, lalu kembalikan Tanggal baru dengan nilai yang disesuaikan

function DateAdd(date, type, amount){
    var y = date.getFullYear(),
        m = date.getMonth(),
        d = date.getDate();
    if(type === 'y'){
        y += amount;
    };
    if(type === 'm'){
        m += amount;
    };
    if(type === 'd'){
        d += amount;
    };
    return new Date(y, m, d);
}

Ingat bahwa bulan-bulan berdasarkan nol, tetapi hari-hari tidak. yaitu Tanggal baru (2009, 1, 1) == 01 Februari 2009, Tanggal baru (2009, 1, 0) == 31 Januari 2009;

Joshua
sumber
2
Apa yang terjadi jika Anda menambahkan misalnya 50 hari ke tanggal dengan cara ini? Apakah akan menetapkan tanggal ke 68 Agustus 2009? Atau Anda yakin ini selalu mencakup bulan dan / atau tahun yang tepat?
Jesper
Digunakan ini untuk menambahkan addDays, addMonths dan addYears ke Date.prototype. Bagus dan sederhana.
Scott Isaacs
1
Ini harus menjadi jawaban yang benar - itu berfungsi bahkan pada hari terakhir tahun ketika jawaban yang diterima gagal.
Keris
Tidak berfungsi untuk tanggal dengan tahun dari 1 hingga 99. ;-) Jauh lebih baik untuk hanya menggunakan metode get * dan set * .
RobG
8

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

let d=new Date(new Date().getTime() - (7 * 24 * 60 * 60 * 1000))
vaibhavmaster
sumber
5

function addDays (date, daysToAdd) {
  var _24HoursInMilliseconds = 86400000;
  return new Date(date.getTime() + daysToAdd * _24HoursInMilliseconds);
};

var now = new Date();

var yesterday = addDays(now, - 1);

var tomorrow = addDays(now, 1);

Petr Makarov
sumber
2

Saya telah membuat fungsi untuk manipulasi tanggal. Anda dapat menambah atau mengurangi jumlah hari, jam, menit.

function dateManipulation(date, days, hrs, mins, operator) {
   date = new Date(date);
   if (operator == "-") {
      var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
      var newDate = new Date(date.getTime() - durationInMs);
   } else {
      var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
      var newDate = new Date(date.getTime() + durationInMs);
   }
   return newDate;
 }

Sekarang, panggil fungsi ini dengan mengirimkan parameter. Misalnya, ini adalah panggilan fungsi untuk mendapatkan tanggal sebelum 3 hari dari hari ini.

var today = new Date();
var newDate = dateManipulation(today, 3, 0, 0, "-");
Malvi Panchal
sumber
2

Gunakan MomentJS .

function getXDaysBeforeDate(referenceDate, x) {
  return moment(referenceDate).subtract(x , 'day').format('MMMM Do YYYY, h:mm:ss a');
}

var yourDate = new Date(); // let's say today
var valueOfX = 7; // let's say 7 days before

console.log(getXDaysBeforeDate(yourDate, valueOfX));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

UtkarshPramodGupta
sumber
1

Jawaban teratas menyebabkan bug dalam kode saya di mana pada bulan pertama akan menetapkan tanggal di bulan ini. Inilah yang saya lakukan,

curDate = new Date(); // Took current date as an example
prvDate = new Date(0); // Date set to epoch 0
prvDate.setUTCMilliseconds((curDate - (5 * 24 * 60 * 60 * 1000))); //Set epoch time
Kishore Avineni
sumber
0

Cara mudah untuk mengelola tanggal adalah menggunakan Moment.js

Anda bisa menggunakannya add. Contoh

var startdate = "20.03.2014";
var new_date = moment(startdate, "DD.MM.YYYY");
new_date.add(5, 'days'); //Add 5 days to start date
alert(new_date);

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

Juan Caicedo
sumber
0

Saya suka yang berikut karena ini adalah satu baris. Tidak sempurna dengan perubahan DST tetapi biasanya cukup baik untuk kebutuhan saya.

var fiveDaysAgo = new Date(new Date() - (1000*60*60*24*5));
ScottE
sumber
0

bagi saya semua kombinasi bekerja dengan baik dengan snipplet kode di bawah, snippet adalah untuk implementasi Angular-2, jika Anda perlu menambahkan hari, berikan angka positifDari, jika Anda perlu mengurangi angka negatifjumlah hari

function addSubstractDays(date: Date, numberofDays: number): Date {
let d = new Date(date);
return new Date(
    d.getFullYear(),
    d.getMonth(),
    (d.getDate() + numberofDays)
);
}
pritesh agrawal
sumber
0

Saya mendapatkan jarak tempuh yang baik dari tanggal. Js:

http://www.datejs.com/

d = new Date();
d.add(-10).days();  // subtract 10 days

Bagus!

Situs web menyertakan keindahan ini:

Datejs tidak hanya mengurai string, ia mengirisnya dengan rapi menjadi dua

Bret Weinraub
sumber
0

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. Subtract 5 days
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), -5));

(Lihat juga Fiddle ini )

John Slegers
sumber
0

Lihat kode berikut, kurangi hari dari tanggal saat ini. Juga, atur bulan sesuai dengan tanggal yang dikurangi.

var today = new Date();
var substract_no_of_days = 25;

today.setTime(today.getTime() - substract_no_of_days* 24 * 60 * 60 * 1000);
var substracted_date = (today.getMonth()+1) + "/" +today.getDate() + "/" + today.getFullYear();

alert(substracted_date);
Manoj Jha
sumber
-1

Saat mengatur tanggal, tanggal dikonversi menjadi milidetik, jadi Anda perlu mengubahnya kembali menjadi tanggal:

Metode ini juga mempertimbangkan perubahan tahun baru, dll.

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

var date_from = new Date();
var date_to = addDays( new Date(), parseInt(days) );
Daniel Williams
sumber
-1

Anda bisa menggunakan Javascript.

var CurrDate = new Date(); // Current Date
var numberOfDays = 5;
var days = CurrDate.setDate(CurrDate.getDate() + numberOfDays);
alert(days); // It will print 5 days before today

Untuk PHP,

$date =  date('Y-m-d', strtotime("-5 days")); // it shows 5 days before today.
echo $date;

Semoga ini bisa membantu Anda.

Phoenix
sumber
-1

Saya dikonversi menjadi milidetik dan mengurangi hari lain bulan dan tahun tidak akan berubah dan logis

var numberOfDays = 10;//number of days need to deducted or added
var date = "01-01-2018"// date need to change
var dt = new Date(parseInt(date.substring(6), 10),        // Year
              parseInt(date.substring(3,5), 10) - 1, // Month (0-11)
              parseInt(date.substring(0,2), 10));
var new_dt = dt.setMilliseconds(dt.getMilliseconds() - numberOfDays*24*60*60*1000);
new_dt = new Date(new_dt);
var changed_date = new_dt.getDate()+"-"+(new_dt.getMonth()+1)+"-"+new_dt.getFullYear();

Semoga bisa membantu

hemanjosko
sumber
-1

var date = new Date();
var day = date.getDate();
var mnth = date.getMonth() + 1;

var fDate = day + '/' + mnth + '/' + date.getFullYear();
document.write('Today is: ' + fDate);
var subDate = date.setDate(date.getDate() - 1);
var todate = new Date(subDate);
var today = todate.getDate();
var tomnth = todate.getMonth() + 1;
var endDate = today + '/' + tomnth + '/' + todate.getFullYear();
document.write('<br>1 days ago was: ' + endDate );

belal ahmad
sumber
1
Anda harus selalu mengomentari kode / jawaban Anda karena beberapa orang mungkin tidak mendapatkan apa yang Anda lakukan
Michael
-1

Menggunakan sintaks fungsi JavaScript Modern

const getDaysPastDate = (daysBefore, date = new Date) => new Date(date - (1000 * 60 * 60 * 24 * daysBefore));

console.log(getDaysPastDate(1)); // yesterday

vdegenne
sumber
-1

Coba sesuatu seperti ini

dateLimit = (curDate, limit) => {
    offset  = curDate.getDate() + limit
    return new Date( curDate.setDate( offset) )
}

currDate bisa tanggal kapan saja

batas bisa menjadi perbedaan dalam jumlah hari (positif untuk masa depan dan negatif untuk masa lalu)

wahid_abdul
sumber
-1

Ini akan memberi Anda hasil 10 hari terakhir, 110% berfungsi, Anda tidak akan mendapatkan masalah apa pun

var date = new Date();
var day=date.getDate();
var month=date.getMonth() + 1;
var year=date.getFullYear();
var startDate=day+"/"+month+"/"+year;
var dayBeforeNineDays=moment().subtract(10, 'days').format('DD/MM/YYYY');
startDate=dayBeforeNineDays;
var endDate=day+"/"+month+"/"+year;

Anda dapat mengubah hari pengurangan sesuai dengan kebutuhan Anda

Zubair
sumber
-2
var daysToSubtract = 3;
$.datepicker.formatDate('yy/mm/dd', new Date() - daysToSubtract) ;
sirWaltmore III
sumber
-2

var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 31);

document.write('<br>5 days ago was: ' + d.toLocaleString());

Gatlingovind
sumber