Hitung tanggal kemarin di JavaScript


279

Bagaimana saya bisa menghitung kemarin sebagai tanggal dalam JavaScript?

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)

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

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


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


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

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

2
Anda sebaiknya menggunakan subtractdaripadaadd
Thomas Ayoub

Bekerja dengan baik juga! Pekerjaan yang bagus untuk FullCalendar dan validRange-nya
XenoX


7
//Create a date object using the current time
var now = new Date();

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

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


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

2
d.setHours(0,0,0,0);

akan melakukan trik


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


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


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 )


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


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

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