Jaki jest najlepszy sposób na zainicjowanie daty JavaScript do północy?

439

Jaki jest najprostszy sposób na uzyskanie wystąpienia nowej daty (), ale ustawienie godziny o północy?

Sixty4Bit
źródło

Odpowiedzi:

874

setHoursMetoda może mieć opcjonalny minutes, secondsa msargumenty, na przykład:

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

Że będzie ustawić czas 00:00:00.000od aktualnej strefy czasowej , jeśli chcesz pracować w czasie UTC, można użyć setUTCHoursmetody.

CMS
źródło
41
Do Twojej wiadomości używam tej metody (d.setHours (0,0,0,0)) w funkcji redukcji w 270K rzędach i jest to ponad 20 sekund szybciej niż robienie d.setHours (0); d.setMinuty (0); d.setSeconds (0); Świetna odpowiedź @CMS!
jbnunn
32
Tę czynność należy wykonać w dwóch wierszach, aby zachować d jako obiekt Date. Ostatnio naprawiłem błąd, który zrobił to w jednym wierszu: var d = nowa data (). SetHours (0, 0, 0, 0). Jednak d było wówczas liczbą, a nie datą, ponieważ setHours zwraca liczbę.
Jason
9
Właśnie się z tym spotkałem (późno na przyjęciu, które znam), również potrzebując rozwiązania jednoliniowego zwracającego datę. Dla każdego, kto szuka tego, @ odpowiedź Zon za działa perfekcyjnie: new Date(new Date().setHours(0,0,0,0)).
SRack
226

Chciałem tylko wyjaśnić, że fragment zaakceptowanej odpowiedzi daje najbliższą północ w przeszłości :

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

Jeśli chcesz uzyskać najbliższą północ w przyszłości , użyj następującego kodu:

var d = new Date();
d.setHours(24,0,0,0); // next midnight
Dan
źródło
6
Co się stanie, jeśli dzisiejszy dzień ma 25 godzin (zegary dostosowują się do czasu letniego)?
qntm
8
To jest skrypt po stronie klienta, północ jest północ, pomimo oszczędności w ciągu dnia. Warto również wspomnieć .. nie każde miejsce na świecie korzysta z DST (czasu letniego)
Chris
2
@qntm: zmiana czasu letniego jest zawsze stosowana o 2 rano-4 rano, więc będzie to tylko jedna północ w ciągu tego dnia :). Ale tak, 3 rano może zdarzyć się dwa razy w ciągu dnia (facepalm)
Dan
@chris Nie, mam na myśli drugi fragment kodu. „24 godziny po północy dzisiaj” nie zawsze jest tym samym, co „jutro północy”. Czy w takich przypadkach działa drugi fragment kodu?
qntm
3
@qntm: Date.setHours nie dodaje na ślepo 24 godzin, jest bardziej inteligentny. Zamiast tego zwraca znacznik czasu, kiedy zegar pokaże 24 następnym razem. Biorąc pod uwagę oszczędność czasu. Spróbuj sam zagrać w konsoli. Ciekawe, setHours (25) zwraca znacznik czasu jutra 1 rano
Dan
68

Jednowarstwowy dla konfiguracji obiektów:

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

Podczas tworzenia elementu:

dateFieldConfig = {
      name: "mydate",
      value: new Date(new Date().setHours(0, 0, 0, 0)),
}
Strefa
źródło
6
Dzięki! zastanawiałem się, jak to zrobić w jednej linii, ponieważ ustawiałem właściwość obiektu! Świetna odpowiedź.
Paulo Roberto Rosa
Dzięki Zon, pomogło mi to napisać jedną linię.
HungrySoul,
22

Dodam to tutaj, bo wylądowałem na tej stronie, szukając sposobu na zrobienie tego w chwili.js i inni też mogą to zrobić.

[Uzasadnienie: słowo „moment” pojawia się już gdzie indziej na tej stronie, więc wyszukiwarki bezpośrednio tutaj, a moment.js jest wystarczająco rozpowszechniony, aby zagwarantować, że będzie on omawiany, jak często jest wymieniany w innych pytaniach SO związanych z datą]

W wersji 2.0.0 i nowszej:

date.startOf('day');

W przypadku wcześniejszych wersji:

date.sod();

Dokumenty:

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

andyhasit
źródło
aby odzyskać obiekt daty, użyj tegomoment(DATE_OBJECT).startOf('day').toDate();
xinthose
2
tak, dodajmy bibliotekę javascript 52 KB, aby zrobić coś, co można zrobić w 2 liniach.
Bruce Lim
19
A jeśli już korzystasz z mom.js z jednego z wielu dobrych powodów, dla których możesz ...? Co powiesz na przeczytanie uzasadnienia, które podałem przed dodaniem sarkastycznego komentarza?
andyhasit
11

Prawdopodobnie możesz użyć

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

jeśli potrzebujesz tej wartości tylko raz.

Stan
źródło
1
Nie uzyskuje to wystąpienia daty, zgodnie z wymaganym PO.
cobberboy
To zdecydowanie najlepsza odpowiedź, ale wymaga niewielkiej edycji, aby zwrócić instancję daty. nowa data (nowa data (). setUTCHours (0, 0, 0, 0));
VitFL
4

Dodając użyteczność do przykładu @ Dana, musiałem znaleźć następne południe lub północ.

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
}

Pozwoliło mi to ustawić ograniczenie częstotliwości dla wydarzenia, pozwalając, aby miało to miejsce tylko raz rano i raz po południu dla każdego odwiedzającego moją witrynę. Przechwycona data została wykorzystana do ustawienia daty ważności pliku cookie.

jamis0n
źródło
4

Jeśli obliczanie według dat lato będzie często powodować 1 godzinę więcej lub godzinę mniej niż północ (CEST). Powoduje to różnicę 1 dnia, gdy daty wracają. Więc daty muszą zaokrąglić do najbliższej północy. Więc kod będzie (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
    }
użytkownik3887038
źródło
3

Zrobiłem dla mnie kilka prototypów.

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

jeśli nie chcesz kontroli bezpieczeństwa, możesz po prostu użyć

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

Przykładowe użycie:

var date = new Date($.now()); // $.now() requires jQuery
console.log('startOfDay: ' + date.startOfDay());
console.log('endOfDay: ' + date.endOfDay());
Mikrofon
źródło
2

Jeśli masz już d3.js jako zależność w swoim projekcie lub nie masz nic przeciwko wprowadzeniu go, czas d3 ( biblioteka d3.js jest modułowa od wersji 4.0.0 ) ma interwały .

Mogą się przydać przy ustawianiu dat na „domyślne” wartości, np. Północ, 0,00 sekundy, pierwszy dzień miesiąca itp.

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)
Peemster
źródło
Zauważyłem więc trend w pytaniach związanych z JavaScript napisanych na SO: bez względu na złożoność rozwiązań zaproponowanych przy użyciu natywnego JS, wszelkie odpowiedzi dotyczące problemu za pomocą zewnętrznej biblioteki nieuchronnie w pewnym momencie zostaną odrzucone. Zdając sobie z tego sprawę, zadbałem o opublikowanie mojej odpowiedzi z szybkim wstępem: na wypadek, gdybyś już miał przykład.js jako zależność . A jednak nadal jest negatywnym, anonimowym użytkownikiem SO? to boli, człowieku: „- (
Peemster,
Uznałem, że ta odpowiedź nie powinna zostać odrzucona, zwłaszcza że osoba proponująca użycie momentu.js ma 16 głosów w górę (w momencie pisania tego komentarza). Rozwiązuje problem w bardzo zwięzły i niezbyt oczywisty sposób.
lukeatdesignworks