Bir JavaScript Tarihini gece yarısına kadar başlatmanın en iyi yolu nedir?


439

Yeni Date () örneğini almanın ancak saati gece yarısı ayarlamanın en basit yolu nedir?

Yanıtlar:


874

setHoursYöntem isteğe bağlı sunar minutes, secondsve msörneğin, bağımsız değişkenler:

var d = new Date();
d.setHours(0,0,0,0);

Yani zamanı ayarlayacaktır 00:00:00.000arasında geçerli saat dilimine Eğer UTC süreyi çalışmaya isterseniz kullanabilirsiniz, setUTCHoursyöntem.


41
Bilginize, 270K satırlarında bir azaltma işlevinde bu yöntemi (d.setHours (0,0,0,0)) çalıştırıyorum ve d.setHours (0) 'dan 20 saniyeden daha hızlı; d.setMinutes (0); d.setSeconds (0); Harika cevap @CMS!
jbnunn

32
D'yi bir Date nesnesi olarak tutmak için bunun iki satırda yapılması gerekir. Geçenlerde bir satırda bunu yapan bir hata düzeltildi: var d = new Date (). SetHours (0, 0, 0, 0). Bununla birlikte, d, setHours bir sayı döndürdüğünden beri bir tarih değil, bir sayıdır.
Jason

9
Ben sadece bir tarih dönen bir satır çözümüne ihtiyacım var, (tanıdığım partiye geç) rastlamak. Bunun için arayan herkes için @ ZON cevabı mükemmel çalışıyor: new Date(new Date().setHours(0,0,0,0)).
SRack

227

Sadece kabul edilen cevaptan snippet'in geçmişteki en yakın gece yarısını verdiğini açıklığa kavuşturmak istedim :

var d = new Date();
d.setHours(0,0,0,0); // last midnight

Gelecekte en yakın gece yarısını almak istiyorsanız aşağıdaki kodu kullanın:

var d = new Date();
d.setHours(24,0,0,0); // next midnight

6
Bugün 25 saat sürüyorsa (saatler Yaz Saati uygulamasına göre ayarlanır) ne olur?
qntm

8
Bu istemci tarafı senaryo, gece yarısı gece yarısı, gün ışığından yararlanma tasarruf rağmen .. Ayrıca dikkat çekici .. dünyanın her yerinde DST (gün ışığından yararlanma saati) kullanır
chris

2
@ qntm: gün ışığından yararlanma saati değişikliği her zaman 02: 00-4: 00 arasında uygulanır, böylece o gün boyunca sadece bir gece yarısı olur :). Ama evet, 03:00 gün boyunca iki kez olabilir (facepalm)
Dan

@chris Hayır, ikinci pasajı kastediyorum. "Bugün gece yarısından 24 saat sonra" her zaman "yarın gece yarısı" ile aynı şey değildir. Bu durumlarda, ikinci snippet çalışır mı?
qntm

3
@ qntm: Date.setHours 24 saat körü körüne eklenmez, daha zekidir. Bunun yerine, saatin bir dahaki sefere 24'ü göstereceği anın zaman damgasını döndürür. Zaman tasarrufu dikkate alınarak. Konsolda kendiniz oynamaya çalışın. İlginç, setHours (25) yarın saat 1 'i döndürür
Dan

68

Nesne yapılandırmaları için bir astar:

new Date(new Date().setHours(0,0,0,0));

Bir öğe oluştururken:

dateFieldConfig = {
      name: "mydate",
      value: new Date(new Date().setHours(0, 0, 0, 0)),
}

6
Teşekkürler! i bir nesne özelliği ayarlıyordu çünkü nasıl tek bir satırda yapabilirim merak ediyordum! Mükemmel cevap.
Paulo Roberto Rosa

Teşekkürler Zon, bu benim tek satır yazmama yardımcı oldu.
HungrySoul

22

Bunu buraya ekleyeceğim çünkü moment.js'de bunu nasıl yapacağımı arayan bu sayfaya indim ve diğerleri de yapabilir.

[Gerekçe: "moment" kelimesi zaten bu sayfada başka bir yerde görünüyor, bu yüzden arama motorları doğrudan buraya ve moment.js diğer tarihle ilgili SO sorularında ne sıklıkta bahsedildiğini garanti altına almak için yeterince geniş.

Yani, sürüm 2.0.0 ve üstü:

date.startOf('day');

Önceki sürümler için:

date.sod();

Dokümanlar:

http://momentjs.com/docs/#/manipulating/start-of/


bir tarih nesnesini geri almak için bunu kullanınmoment(DATE_OBJECT).startOf('day').toDate();
xinthose

2
yay, 2 satırda yapabileceğiniz bir şey yapmak için 52kb'lik bir javascript kütüphanesi ekleyelim.
Bruce Lim

19
Peki moment.js'yi birçok olası nedenden biri için zaten kullanıyorsanız ...? Alaycı bir yorum eklemeden önce verdiğim mantığı okumaya ne dersin?
andyhasit

11

Muhtemelen kullanabilirsiniz

new Date().setUTCHours(0,0,0,0)

değere sadece bir kez ihtiyacınız varsa.


1
Bu OP'nin gerektirdiği gibi bir Tarih örneği almaz.
cobberboy

Bu kesinlikle en iyi cevaptır, ancak bir Tarih örneğini döndürmek için biraz düzenleme yapılması gerekir. yeni Tarih (yeni Tarih (). setUTCHours (0, 0, 0, 0));
VitFL

4

@ Dan'ın örneğine yararlılık ekleyerek, bir sonraki gece yarısı veya gece yarısı bulmam gerekiyordu.

var d = new Date();
if(d.getHours() < 12) {
   d.setHours(12,0,0,0); // next midnight/midday is midday
} else {
   d.setHours(24,0,0,0); // next midnight/midday is midnight
}

Bu, bir etkinlik için sıklık sınırı belirlememe izin verdi, bu da siteme gelen herhangi bir ziyaretçi için yalnızca sabahları ve öğleden sonra bir kez gerçekleşmesine izin verdi. Yakalanan tarih, çerezin sona ermesini ayarlamak için kullanıldı.


4

Tarihler yaz ile hesaplanıyorsa genellikle gece yarısından (CEST) 1 uur veya bir saat daha az neden olur. Bu, tarihler döndüğünde 1 gün farkına neden olur. Bu yüzden tarihler en yakın gece yarısına yuvarlanmalıdır. Kod şu şekilde olacaktır (ths to jamisOn):

    var d = new Date();
    if(d.getHours() < 12) {
    d.setHours(0,0,0,0); // previous midnight day
    } else {
    d.setHours(24,0,0,0); // next midnight day
    }

3

Bunu benim için halletmek için birkaç prototip yaptım.

// This is a safety check to make sure the prototype is not already defined.
Function.prototype.method = function (name, func) {
    if (!this.prototype[name]) {
        this.prototype[name] = func;
        return this;
    }
};

Date.method('endOfDay', function () {
    var date = new Date(this);
    date.setHours(23, 59, 59, 999);
    return date;
});

Date.method('startOfDay', function () {
    var date = new Date(this);
    date.setHours(0, 0, 0, 0);
    return date;
});

emniyet kontrolünü istemiyorsanız, sadece

Date.prototype.startOfDay = function(){
  /*Method body here*/
};

Örnek kullanım:

var date = new Date($.now()); // $.now() requires jQuery
console.log('startOfDay: ' + date.startOfDay());
console.log('endOfDay: ' + date.endOfDay());

2

Projenizde zaten bir bağımlılık olarak d3.js'niz varsa veya onu getirmeyi düşünmüyorsanız, d3-time ( d3.js kütüphanesi v4.0.0'dan itibaren modülerdir ) Aralıkları vardır .

Tarihleri ​​"varsayılan" değerlere ayarlarken faydalı olabilir, örn. Gece yarısı, 0,00 saniye, ayın ilk günü, vb.

var d = new Date(); // Wed Aug 02 2017 15:01:07 GMT+0200 (CEST)
d3.timeHour(d) // Wed Aug 02 2017 00:00:00 GMT+0200 (CEST)
d3.timeMonth(d) // Tue Aug 01 2017 00:00:00 GMT+0200 (CEST)

Yani SO ile ilgili JavaScript ile ilgili sorularda bir eğilim fark ettim: yerel JS kullanarak ortaya konulan çözümlerin karmaşıklığı ne olursa olsun, harici bir kütüphane yardımıyla sorunu ele alan herhangi bir cevap kaçınılmaz olarak bir süre sonra iptal edilecektir. Bunu fark ederek, cevabımı hızlı önsözle göndermeye özen gösterdim: Bağımlılık olarak example.js'nin zaten olması durumunda . Ve yine de downvote, anonim SO kullanıcı? acıtıyor, adam: '- (
Peemster

Özellikle moment.js'nin kullanılmasını öneren kişinin 16 oyu olduğu için (bu yorumu yazarken) bu cevabın aşağı seçilmemesi gerektiğini düşündüm. Sorunu çok açık bir şekilde değil, çok özlü bir şekilde çözüyor.
lukeatdesignworks
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.