2010-10-08 17 views

Odpowiedz

571

Sposób setHours może opcjonalne minutes, seconds i ms argumenty, na przykład:

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

To będzie ustawić czas 00:00:00.000 z aktualna strefa czasowa, jeśli chcesz pracować w czasie UTC, możesz użyć metody setUTCHours.

+24

FYI, używam tej metody (d.setHours (0,0,0,0)) w funkcji ograniczenia na 270K rzędach, a to ponad 20 sekund szybciej niż robi d.setHours (0); d.setMinutes (0); d.setSeconds (0); Świetna odpowiedź @CMS! – jbnunn

+15

Należy to zrobić w dwóch wierszach, aby zachować d jako obiekt Date. Niedawno naprawiłem błąd, który spowodował to w jednym wierszu: var d = new Date(). SetHours (0, 0, 0, 0). Jednak d był wtedy liczbą, a nie datą, ponieważ setHours zwraca liczbę. – Jason

+0

Właśnie się z tym zetknąłem (spóźniałem się na imprezę, którą znam), potrzebuję też rozwiązania jednoliniowego zwracającego datę. Dla każdego, kto tego chce, [odpowiedź @ Zona] (https://stackoverflow.com/questions/3894048/what-is-the-best-way-to-initialize-a-javascript-date-to-midnight#answer- 30100627) działa idealnie: 'nowa data (nowa data(). SetHours (0,0,0,0))'. – SRack

135

Chciałem tylko wyjaśnić, że fragment z przyjętą odpowiedzi daje najbliższy północy w minionym:

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

Jeśli chcesz uzyskać najbliższy północy w przyszłości, należy użyć następującego kodu:

var d = new Date(); 
d.setHours(24,0,0,0); // next midnignt 
+5

Co się stanie, jeśli dzisiaj jest 25 godzin (zegary dostosowują się do czasu letniego)? – qntm

+7

To jest skrypt po stronie klienta, północ jest północą, pomimo oszczędności światła dziennego. Warto również wspomnieć ... nie każde miejsce na świecie korzysta z DST (czas letni) – chris

+0

@qntm: zmiana czasu na letni jest zawsze stosowana o 2 rano 4 am, tak, że będzie to tylko jedna północ w ciągu tego dnia :). Ale tak, 3am może zdarzyć się dwa razy w ciągu dnia (facepalm) – Dan

3

Dodając przydatność do przykładu @ Dana, musiałem znaleźć następny dzień 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 
} 

To pozwoliło mi ustawić ograniczenie liczby na razie tylko pozwalając mu się zdarzyć raz rano i raz po południu dla wszystkich odwiedzających na mojej stronie. Data przechwycona została użyta do ustawienia wygaśnięcia pliku cookie.

17

one-liner do configs obiektu:

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

Dzięki! zastanawiałem się, jak mogę to zrobić w jednym wierszu, ponieważ ustawiłem właściwość obiektu! Świetna odpowiedź. –

16

prostu będzie dodać to tutaj, bo wylądował na tej stronie patrząc na, jak to zrobić w moment.js i inne mogą również.

[Uzasadnienie: słowo „moment” już pojawia się w innym miejscu na tej stronie tak wyszukiwarek kierować tutaj, a moment.js jest na tyle powszechne, by uzasadnić na czym pokryte dzieje, jak często jest ona wymieniona w innym terminie związanych SO pytania]

Tak, w wersji 2.0.0 i powyżej:

date.startOf('day'); 

dla wcześniejszych wersjach:

date.sod(); 

Docs:

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

+0

aby odzyskać obiekt daty, użyj tego 'momentu (DATE_OBJECT) .startOf (" dzień "). ToDate();' – xinthose

+1

tak, dodajmy bibliotekę javascript 52kb, aby zrobić coś, co możesz zrobić w 2 linijkach. –

+8

A co, jeśli już używasz pliku moment.js do jednego z wielu dobrych powodów, dla których mógłbyś ...? Co powiesz na przeczytanie racjonalnego uzasadnienia, zanim dodasz sarkastyczny komentarz? – andyhasit

2

Prawdopodobnie można użyć

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

jeśli trzeba wartość tylko raz.

+0

Nie powoduje to wystąpienia daty, zgodnie z wymaganym PO. – cobberboy

3

Jeśli obliczenia z datami summertime spowoduje często 1 lub więcej godzin lub godzinę mniej niż północ (CEST). Powoduje to 1-dniową różnicę po zwrocie dat. Tak więc daty muszą zaokrąglić się do najbliższej północy.Więc kod będzie (tys do 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

    var a = new Array(); 
 
\t \t \t \t \t var b = new Array(); 
 
\t \t \t \t \t var c = new Array(); 
 
\t \t \t \t \t var date = new Date().toJSON(); 
 
\t \t \t \t \t a = date.split("T"); 
 
\t \t \t \t \t a = a[0]; 
 
\t \t \t \t \t b = a.split("-"); 
 
\t \t \t \t \t var currentDate = new Date(b[0],b[1] , b[2] -29 ,-19,30,0).toJSON(); 
 
\t \t \t \t \t c = currentDate.split("."); 
 
\t \t \t \t \t var newDate = c[0]; 
 
console.log(newDate);

+0

Kudos dla kreatywności: D –

0

W przypadku jeśli masz już d3.js jako zależność w projekcie, czy nie przeszkadza przenosząc je w , d3-time (d3.js library is modular as of v4.0.0) ma numer Intervals.

Mogą okazać się przydatne przy ustawianiu dat na "domyślne" wartości, np. północy, 0,00 sekundy, pierwszy od 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) 
+0

Zauważyłem trend w pytaniach związanych z JavaScriptem napisanych na SO: bez względu na złożoność rozwiązań proponowanych przy użyciu natywnego JS, wszelkie odpowiedzi dotyczące problemu przy pomocy zewnętrznej biblioteki będą nieuchronnie niektóre momenty zostaną obniżone. Zdając sobie z tego sprawę, zadbałem o opublikowanie mojej odpowiedzi w krótkim przedmowie: _W przypadku, gdy masz już example.js jako zależność_. A jednak nadal w dół, anonimowy użytkownik SO? to boli, człowieku: "- ( – Peemster

+0

Upadłem, że ta odpowiedź nie powinna zostać odrzucona, tym bardziej, że propozycja użycia chwili.js ma 16 głosów w górę (w chwili pisania tego komentarza).Rozwiązuje problem w bardzo zwięzły i nie tak oczywisty sposób. – lukeatdesignworks

Powiązane problemy