Hitung tanggal kemarin di JavaScript

279

Bagaimana saya bisa menghitung kemarin sebagai tanggal dalam JavaScript?

Akhir
sumber

Jawaban:

458
var date = new Date();

date ; //# => Fri Apr 01 2011 11:14:50 GMT+0200 (CEST)

date.setDate(date.getDate() - 1);

date ; //# => Thu Mar 31 2011 11:14:50 GMT+0200 (CEST)
James Kyburz
sumber
12
Bagus. Pada pandangan pertama, sepertinya ini akan gagal karena getDatemengembalikan hari dalam sebulan (misalnya: 1 - 31) tetapi sebenarnya setDate(0)menetapkan tanggal ke hari terakhir bulan sebelumnya. Apakah ini berfungsi di semua browser?
Drew Noakes
1
Tidak dapat memverifikasi "semua" peramban tetapi berfungsi di semua yang saya uji coba camo.githubusercontent.com/...
James Kyburz
1
@ Zargold Tidak mengerti maksud Anda. node --version v9.4.0 node const date = Date baru () tidak ditentukan> date.toISOString () '2018-02-10T16: 26: 30.821Z'> date.setDate (date.getDate () - 1) 1518193590821> date .toISOString () '2018-02-09T16: 26: 30.821Z'
James Kyburz
Hmm ya baru saja mengujinya secara langsung dan Anda benar, tidak yakin bagaimana kasus penggunaan saya berbeda dan sejak itu sepenuhnya refactored jauh dari itu. Jadi saya tidak akan bisa melihat.
Zargold
91

Tidak terlalu efisien, tetapi sebagai oneliner:

var yesterday = new Date(new Date().setDate(new Date().getDate()-1));

Di atas menciptakan tiga Dateobjek yang sia-sia sia-sia. Ini dapat direduksi menjadi satu instantiasi dengan:

var yesterday = (function(){this.setDate(this.getDate()-1); return this})
                  .call(new Date)

Atau, jika Anda lebih suka:

var yesterday = (function(d){ d.setDate(d.getDate()-1); return d})(new Date)

Atau, jika Anda lebih suka ES6 dengan fungsi panah:

let yesterday = ( d => new Date(d.setDate(d.getDate()-1)) )(new Date);
KooiInc
sumber
6
Saya lebih suka menghindari bermain-main dengan ruang lingkup:var yesterday = (function(d){ d.setDate(d.getDate()-1); return d})(new Date)
Roy Tinker
4
Jika Anda memerlukan one-liner, gunakan sesuatu seperti Date baru (Date.now () - 24 * 60 * 60 * 1000); ini memiliki manfaat hanya membuat satu objek Date. Tapi jujur, siapa pun yang menjaga kode ini akan jauh lebih bahagia melihat versi 2-baris yang jelas daripada mereka akan melakukan fungsi melempar sekitar (atau milidetik, dalam hal ini).
Rob Whelan
66

Coba ini

var d = new Date();
d.setDate(d.getDate() - 1);
ashishjmeshram
sumber
1
Perintah selanjutnya d.setHours (19,59); Untuk mengatur waktu ke 19:59
James Jenkins
60

Anehnya tidak ada jawaban untuk solusi lintas peramban yang paling mudah

Untuk menemukan waktu yang persis sama kemarin:

var yesterday = new Date(Date.now() - 86400000); // that is: 24 * 60 * 60 * 1000

Itu jika Anda ingin bebas dari ketergantungan, jika tidak saya sarankan menggunakan http://momentjs.com

Fabiano Soriani
sumber
7
Bagaimana cara kerjanya saat penghematan di siang hari berubah? Bukankah itu menabrak di depan / di belakang satu jam?
Adam Tegen
19

Untuk menggeneralisasi pertanyaan dan membuat perhitungan lain, gunakan:

var yesterday = new Date((new Date()).valueOf() - 1000*60*60*24);

ini menciptakan objek tanggal baru berdasarkan nilai "sekarang" sebagai bilangan bulat yang mewakili zaman unix dalam milidetik yang mengurangi satu hari.

Dua hari yang lalu:

var twoDaysAgo = new Date((new Date()).valueOf() - 1000*60*60*24*2);

Satu jam yang lalu:

var oneHourAgo = new Date((new Date()).valueOf() - 1000*60*60);
Ami Heines
sumber
Ini tampaknya menjadi metode teraman karena kami beroperasi pada zaman unix yang dinyatakan dalam milidetik. Jadi aritmatika lebih aman daripada melakukan sesuatu seperti getDate () - 1. Saya belum mencoba getDate () - 1, tetapi berdasarkan dokumentasi getDate (), ini akan mengembalikan 1 jika tanggal hari ini adalah tanggal 1 setiap bulan. Dan 1-1 = 0 bukan tanggal yang valid. Tidak yakin bagaimana setDate (0) akan berfungsi.
Kapil Pendse
1
Ini adalah pendekatan saya, meskipun Anda dapat menyederhanakannya juga - coba sesuatu seperti Date baru (Date.now () - 24 * 60 * 60 * 1000);
Rob Whelan
setDate (0), btw, akan baik-baik saja - itu akan beralih ke hari terakhir bulan sebelumnya. Tetapi tampaknya lebih rapi (dan lebih intuitif) untuk menjatuhkan lakukan representasi milidetik di sini, bagi saya - satu-satunya downside adalah bahwa "jumlah milis dalam sehari" tidak begitu jelas, sehingga bisa dengan mudah salah ketik perhitungan itu.
Rob Whelan
Bekerja dengan waktu unix sepertinya pilihan yang lebih dapat diandalkan. Ini harus dinilai lebih tinggi.
Paul
Ya, saya paling suka pendekatan ini. Ada sedikit ambiguitas. Saya akhirnya pergi dengan new Date(Date.parse(new Date()) - 86400000). Meskipun saya suka Date.now () jadi mungkin saya akan mencobanya. Ini akan menyimpan tanggal tambahan.
coblr
9

Saya menggunakan perpustakaan saat ini , sangat fleksibel dan mudah digunakan.

Dalam kasus Anda:

let yesterday = moment().subtract(1, 'day').toDate();
guyaloni
sumber
2
Anda sebaiknya menggunakan subtractdaripadaadd
Thomas Ayoub
Bekerja dengan baik juga! Pekerjaan yang bagus untuk FullCalendar dan validRange-nya
XenoX
8
new Date(new Date().setDate(new Date().getDate()-1))
Gopinath Radhakrishnan
sumber
3
Bisakah Anda menambahkan sedikit penjelasan? Blok kode biasa saja tidak terlalu membantu
SpecificPerformance
Bekerja dengan baik ! Terima kasih
XenoX
7
//Create a date object using the current time
var now = new Date();

//Subtract one day from it
now.setDate(now.getDate()-1);
Billyhomebase
sumber
6

var today = new Date();
var yesterday1 = new Date(new Date().setDate(new Date().getDate() - 1));
var yesterday2 = new Date(Date.now() - 86400000);
var yesterday3 = new Date(Date.now() - 1000*60*60*24);
var yesterday4 = new Date((new Date()).valueOf() - 1000*60*60*24);
console.log("Today: "+today);
console.log("Yesterday: "+yesterday1);
console.log("Yesterday: "+yesterday2);
console.log("Yesterday: "+yesterday3);
console.log("Yesterday: "+yesterday4);

Deepu Reghunath
sumber
5

Ini akan menghasilkan kemarin pukul 00:00 dengan presisi menit

var d = new Date();
d.setDate(d.getDate() - 1);
d.setTime(d.getTime()-d.getHours()*3600*1000-d.getMinutes()*60*1000);
Evgeni Makarov
sumber
2
d.setHours(0,0,0,0);

akan melakukan trik

godzillante
sumber
1
Akankah itu? Saya pikir ini hanya mengatur jam, menit, dan detik ke 0, tetapi tidak benar-benar mengubah tanggal?
Jesper Bylund
Aku harus menggunakan angka negatif untuk mendapatkan kemarin: d.setHours(-1,0,0,0). Ini akan mengembalikan tanggal kemarin, tetapi mungkin bukan waktu yang Anda inginkan (23:00:00)
cs_pupil
1

Cobalah ini, bekerja untuk saya:

var today = new Date();
var yesterday = new Date(today.setDate(today.getDate() - 1)); `

Ini membuat saya objek kencan kembali untuk kemarin

Ken Ye
sumber
1
Karena Anda menggunakan today.setDate, hari ini juga akan berubah menjadi kemarin. Lebih baik membuat variabel kemarin dan mengaturnya. var yesterday = new Date(); yesterday.setDate(today.GetDate() - 1)sehingga Anda dapat menggunakan hari ini dan kemarin
PersyJack
1

Berikut ini adalah satu liner yang digunakan untuk mendapatkan tanggal kemarin dalam format YYYY-MM-DD dalam teks dan menangani offset zona waktu.

new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('T')[0]

Jelas dapat berubah menjadi tanggal kembali, x hari mundur. Termasuk waktu dll.

console.log(Date())
console.log(new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('T')[0]); // "2019-11-11"
console.log(new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('.')[0].replace('T',' ')); // "2019-11-11 11:11:11"

// that is: [dates] * 24 * 60 * 60 * 1000 - offsetinmin * 60 * 1000    // this is: [dates] * 24 * 60 * 60 * 1000 - offsetinmin * 60 * 1000

Grifon
sumber
0

Jika Anda ingin mendapatkan tanggal untuk kemarin dan memformat tanggal itu dalam format yang dapat dibaca manusia, pertimbangkan untuk membuat DateHelperobjek khusus 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 1 day
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), -1));

(Lihat juga Fiddle ini )

John Slegers
sumber
0

Anda dapat menggunakan momentjs. Sangat membantu Anda dapat mencapai banyak hal dengan perpustakaan ini.

Dapatkan tanggal kemarin dengan waktu saat ini moment().subtract(1, 'days').toString()

Dapatkan tanggal kemarin dengan tanggal mulai moment().subtract(1, 'days').startOf('day').toString()

Abhishek Kumar Pandey
sumber
0

memecahkan masalah batas tanggal (2020, 01, 01) -> 2019, 12, 31

var now = new Date();
return new Date(now.getMonth() - 1 === 0 ? now.getFullYear() - 1 : now.getFullYear(),
                now.getDate() - 1 === 0 ? now.getMonth() - 1: now.getMonth(),
                now.getDate() - 1);
Eric Chan
sumber
-1

"Date.now () - 86400000" tidak akan berfungsi pada akhir hari Daylight Saving (yang memiliki 25 jam hari itu)

Pilihan lain adalah menggunakan Penutupan:

var d = new goog.date.Date();
d.add(new goog.date.Interval(0, 0, -1));
pengguna10605953
sumber