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?

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.


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

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)),
}

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/


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.


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.


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
    }

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

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)

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.