Jak zacząć i zakończyć dzień w Javascript?

271

Jak rozpocząć (00:00:00) i zakończyć (23:59:59) dzisiejszego czasu (GMT)? Komputer korzysta z czasu lokalnego.

Bdfy
źródło

Odpowiedzi:

526
var start = new Date();
start.setHours(0,0,0,0);

var end = new Date();
end.setHours(23,59,59,999);

alert( start.toUTCString() + ':' + end.toUTCString() );

Jeśli chcesz uzyskać od nich czas UTC, możesz użyć UTC().

tvanfosson
źródło
24
Polecam, var end = new Date(start.getTime());aby upewnić się, że masz ten sam punkt w czasie - w przypadku zmiany daty między początkową i końcową inicjalizacją - może się zdarzyć - po prostu dobry nawyk, aby się w to włączyć
Martyn Davis
@MartynDavis, gdy wszystko działa normalnie, zwykle pomiędzy nimi dzieje się około 0-2 tyknięć, ale zależy to od tego, jak zajęty jest procesor, więc warto to zrobić, jeśli martwisz się precyzją 1 tyknięcia.
Jason Sebring
14
setUTCHourssetHours
Poleciłbym
2
Mogło się zmienić, ale dla mnie to ustawia początek UTC na dzień poprzedni i koniec UTC na dzień poprzedni.
David J
5
Przeczytaj niezwykle ważny komentarz @ sidonaldson. Korzystanie setHoursjest niebezpieczne, ponieważ ustawia godziny lokalne zamiast godzin UTC.
Michael
229

Korzystając z biblioteki momentjs , można to osiągnąć za pomocą metod startOf()i endOf()dla obiektu bieżącej daty momentu, przekazując ciąg 'day'jako argumenty:

Lokalny GMT:

var start = moment().startOf('day'); // set to 12:00 am today
var end = moment().endOf('day'); // set to 23:59 pm today

Dla UTC:

var start = moment.utc().startOf('day'); 
var end = moment.utc().endOf('day'); 
chridam
źródło
22
momentjs to kompleksowa obsługa wszystkich czynności związanych z obsługą czasu JavaScript. Zawsze warte importu.
Daniel F
8
I .toDate()w końcu powinniśmy skorzystać z tej daty. var end = moment().endOf('day').toDate();
YaTaras,
5
dodaj .unix()na końcu, aby uzyskać znacznik czasu unix w kilka sekund :) tak:moment().startOf('day').unix()
Lukas Liesis
5
moment js jakoś nie działa, jeśli mam predefiniowany obiekt Date, np. moment(new Date()).endOf("day");nie działa, ale moment().endOf("day");działa.
B. Kemmer,
5
@KlasMellbourn Aby dostać początek dnia dla określonej strefy czasowej, można użyć moment-timezonei to zrobić: moment().tz('America/Chicago').startOf('day').toDate().
Chad Johnson
8

Korzystając z biblioteki luxon.js , to samo można osiągnąć za pomocą metod startOf i endOf, przekazując parametr „day” jako parametr

var DateTime = luxon.DateTime;
DateTime.local().startOf('day').toUTC().toISO(); //2017-11-16T18:30:00.000Z
DateTime.local().endOf('day').toUTC().toISO(); //2017-11-17T18:29:59.999Z
DateTime.fromISO(new Date().toISOString()).startOf('day').toUTC().toISO(); //2017-11-16T18:30:00.000Z

usuń .toUTC (), jeśli potrzebujesz tylko czasu lokalnego

i można zapytać, dlaczego nie moment.js , odpowiedź jest tu za to.

tk120404
źródło
6

W MomentJs możemy to zadeklarować w następujący sposób:

   const start = moment().format('YYYY-MM-DD 00:00:01');
   const end = moment().format('YYYY-MM-DD 23:59:59');
Ashutosh Jha
źródło
o wiele bardziej pomocny!
Darlan Dieterich,
6

Jeśli interesują Cię tylko znaczniki czasu w GMT, możesz to również zrobić, które można wygodnie dostosować do różnych interwałów (godzina:, 1000 * 60 * 6012 godzin: 1000 * 60 * 60 * 12itd.)

const interval = 1000 * 60 * 60 * 24; // 24 hours in milliseconds

let startOfDay = Math.floor(Date.now() / interval) * interval;
let endOfDay = startOfDay + interval - 1; // 23:59:59:9999
afinemonkey
źródło
1
Ważne zastrzeżenie: działa tylko, jeśli chcesz mieć czas w UTC. (Właśnie o to pytano ... ale czuję, że powinienem ostrzec każdego, kto przybył tu z wyszukiwarki Google i nie zdawał sobie z tego sprawy.)
Kip
4

FYI (połączona wersja Tvanfosson)

zwróci rzeczywistą datę => datę, kiedy wywołujesz funkcję

export const today = {
  iso: {
    start: () => new Date(new Date().setHours(0, 0, 0, 0)).toISOString(),
    now: () => new Date().toISOString(),
    end: () => new Date(new Date().setHours(23, 59, 59, 999)).toISOString()
  },
  local: {
  start: () => new Date(new Date(new Date().setHours(0, 0, 0, 0)).toString().split('GMT')[0] + ' UTC').toISOString(),
  now: () => new Date(new Date().toString().split('GMT')[0] + ' UTC').toISOString(),
  end: () => new Date(new Date(new Date().setHours(23, 59, 59, 999)).toString().split('GMT')[0] + ' UTC').toISOString()
  }
}

// jak używać

today.local.now(); //"2018-09-07T01:48:48.000Z" BAKU +04:00
today.iso.now(); // "2018-09-06T21:49:00.304Z" * 

* ma zastosowanie do typu czasu natychmiastowego w Javie 8, który automatycznie konwertuje czas lokalny w zależności od regionu (jeśli planujesz napisać aplikację globalną)

Musa
źródło
0

Wolę używać biblioteki date-fns do manipulowania datami. To naprawdę świetne modułowe i spójne narzędzie. Możesz zacząć i zakończyć dzień w ten sposób:

var startOfDay = dateFns.startOfDay;
var endOfDay = dateFns.endOfDay;

console.log('start of day ==> ', startOfDay(new Date('2015-11-11')));
console.log('end of day ==> ', endOfDay(new Date('2015-11-11')));
<script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.29.0/date_fns.min.js"></script>

Michaił Szabrikow
źródło
Brak obsługi obsługi UTC.
Dobromir Hristov