JavaScript'te dün tarihi hesaplama


279

Dün JavaScript'te tarih olarak nasıl hesaplayabilirim ?

Yanıtlar:


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
Güzel. İlk bakışta, bunun getDateayın gününü döndürdüğü için başarısız gibi görünebilir (örn: 1 - 31), ancak aslında setDate(0)tarihi bir önceki ayın son gününe ayarlar. Bu tüm tarayıcılarda çalışıyor mu?
Drew Noakes

1
"Tüm" tarayıcılar doğrulanamadı ancak tüm testlerde çalıştım camo.githubusercontent.com/…
James Kyburz

1
@Zargold Ne demek istediğini anlamıyorum. düğüm - sürüm v9.4.0 düğüm sabit tarih = yeni Tarih () tanımsız> date.toISOString () '2018-02-10T16: 26: 30.821Z'> tarih.setDate (date.getDate () - 1) 1518193590821> tarih .toISOString () '2018-02-09T16: 26: 30.821Z'
James Kyburz

Hmm evet sadece doğrudan test etti ve haklısın, kullanım durumumun nasıl farklı olduğundan ve o zamandan beri tamamen yeniden düzenlendiğinden emin değilim. Bu yüzden göremeyeceğim.
Zargold

91

Çok verimli değil, oneliner olarak:

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

Yukarıdakiler Dategereksiz yere savurgan olan üç nesne yaratır . Bu, aşağıdakilerle tek bir somutlaştırmaya indirilebilir:

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

Veya, isterseniz:

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

Veya ok işlevli ES6'yı tercih ederseniz:

let yesterday = ( d => new Date(d.setDate(d.getDate()-1)) )(new Date);

6
Kapsamla uğraşmaktan kaçınmayı tercih ederim:var yesterday = (function(d){ d.setDate(d.getDate()-1); return d})(new Date)
Roy Tinker

4
Tek astar gerekiyorsa, yeni Tarih (Date.now () - 24 * 60 * 60 * 1000); bunun yalnızca bir Date nesnesi oluşturma avantajı vardır. Ama dürüst olmak gerekirse, bu kodu koruyan herkes , açık 2 satırlı sürümü görmek, işlevlerin etrafına (veya bu konu için milisaniye) atılan bir şeyden çok daha mutlu olacaktır.
Rob Whelan


60

Şaşırtıcı bir şekilde en kolay çapraz tarayıcı çözümüne cevap yok

Dün tam olarak aynı saati bulmak için:

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

Eğer bağımlılık ücretsiz gitmek istiyorsanız, aksi takdirde http://momentjs.com kullanmanızı tavsiye ederim


7
Gün ışığından yararlanma değiştiğinde bu nasıl çalışır? Bu bir saat ileri / geri çarpmaz mı?
Adam Tegen

19

Soruyu genelleştirmek ve diğer fark hesaplamalarını yapmak için:

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

bu, bir gün çıkarılan milisaniye cinsinden unix çağını temsil eden bir tam sayı olarak "now" değerine dayalı yeni bir tarih nesnesi oluşturur.

İki gün önce:

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

Bir saat önce:

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

Milisaniye cinsinden ifade edilen unix çağında faaliyet gösterdiğimiz için bu en güvenli yöntem gibi görünüyor. Yani aritmetik getDate () - 1 gibi bir şey yapmaktan daha güvenlidir. GetDate () - 1'i denemedim, ancak getDate () belgelerine dayanarak, bugünün tarihi herhangi bir ayın 1'i ise 1 döndürecektir. Ve 1-1 = 0 geçerli bir tarih değil. SetDate (0) 'un nasıl çalışacağından emin değilim.
Kapil Pendse

1
Bu benim yaklaşımımdı, ancak biraz da basitleştirebilirsiniz - yeni Tarih gibi bir şey deneyin (Date.now () - 24 * 60 * 60 * 1000);
Rob Whelan

setDate (0), btw, iyi olur - bir önceki ayın son gününe döner. Ama burada milisaniye sunumunu yapmak için daha düzenli (ve daha sezgisel) görünüyor - bir dezavantajı "bir günde milis sayısı" kadar açık olmadığı için, bu hesaplamanın yanlış yazılması kolay olabilir.
Rob Whelan

Unix zamanı ile çalışmak daha güvenilir bir seçenek gibi görünüyor. Bu puanın daha yüksek olması gerekir.
Paul

Evet, bu yaklaşımı en çok seviyorum. Daha az belirsizlik var. Ben sona erdi new Date(Date.parse(new Date()) - 86400000). Ben Date.now () gibi olsa da belki ben bunun yerine deneyeceğim. Fazladan bir tarih kaydedecektir.
coblr

9

Moment kütüphanesini kullanıyorum , çok esnek ve kullanımı kolay.

Senin durumunda:

let yesterday = moment().subtract(1, 'day').toDate();

2
subtractyerine kullanmanız daha iyi oluradd
Thomas Ayoub

Çok iyi çalışıyor! FullCalendar ve onun geçerliRange
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

Bu dün 00:00 'da dakika hassasiyetle üretecek

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

hile yapacak


1
Olur mu? Bunun sadece saatlerinizi, dakikalarınızı ve saniyelerinizi 0 olarak ayarladığını düşündüm, ancak tarihi gerçekten değiştirmiyor mu?
Jesper Bylund

Düne ulaşmak için negatif sayılar kullanmak zorunda kaldım d.setHours(-1,0,0,0). Bu, dünün tarihini döndürür, ancak istediğiniz zaman olmayabilir (
23:00:00

1

Bunu bir dene, benim için çalışıyor:

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

Bu bana dün için bir tarih nesnesi getirdi


1
Bugün kullandığınızdan beri. SetDate, bugün de dün değişecek. Dün değişken oluşturmak ve daha sonra ayarlamak daha iyidir. var yesterday = new Date(); yesterday.setDate(today.GetDate() - 1)böylece hem bugün hem de dün kullanabilirsiniz
PersyJack

1

İşte YYYY-AA-GG biçiminde dün tarihini almak ve saat dilimi ofsetini işlemek için kullanılan bir astar.

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

Geri dönüş tarihine x gün geri dönmek için açıkça değiştirilebilir. Zaman dahil etmek vb.

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

Hem dünün tarihini almak hem de o tarihi insan tarafından okunabilir biçimde biçimlendirmek DateHelperistiyorsanız, şuna benzer bir özel nesne oluşturmayı düşünün :

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

(ayrıca bu Fiddle'a bakın )


0

Momentjs kullanabilirsiniz bu kütüphane ile bir çok şey elde etmek çok yararlı.

Geçerli tarihle dün tarihini al moment().subtract(1, 'days').toString()

Dün tarihini bir tarih başlangıcı ile alın moment().subtract(1, 'days').startOf('day').toString()


0

sınır tarih problemini çöz (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" Yaz Saati uygulamasında (o gün 25 saati olan) çalışmaz

Başka bir seçenek de Closure kullanmaktır:

var d = new goog.date.Date();
d.add(new goog.date.Interval(0, 0, -1));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.