Як розпочати та закінчити день у Javascript?


271

Як розпочати (00:00:00) і закінчити (23:59:59) сьогодні в часовій марці (GMT)? Використання комп'ютера за місцевим часом.

Відповіді:


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

Якщо вам потрібно отримати час від них, ви можете використовувати UTC().


24
Я рекомендую, var end = new Date(start.getTime());щоб переконатися, що у вас є той самий момент часу - якщо ви зміните дати між початковою та кінцевою ініціалізацією - це може статися - просто хороша звичка потрапляти
Мартін Девіс,

@MartynDavis, коли все працює нормально, зазвичай близько 0-2 кліщів відбувається між ними, але це залежить від того, наскільки зайнятий процесор, то це має сенс зробити це, якщо ви переживаєте за точність 1 галочки.
Джейсон Себрінг

14
Я також порекомендував би setUTCHoursзамість цього setHoursотримати універсальний час
sidonaldson

2
Можливо, змінилися речі, але для мене це встановлює початок початку UTC за попередній день і закінчення UTC за попередній день.
David J

5
Прочитайте надзвичайно важливий коментар @ sidonaldson. Використання setHoursнебезпечно, оскільки воно встановлює місцеві години, а не години UTC.
Майкл

229

Використовуючи бібліотеку momentjs , це можна досягти за допомогою startOf()та endOf()методів на об'єкті поточної дати, передаючи рядок 'day'як аргументи:

Місцевий GMT:

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

За UTC:

var start = moment.utc().startOf('day'); 
var end = moment.utc().endOf('day'); 

22
momentjs - це єдине вікно для всіх речей, пов’язаних з обробкою часу JavaScript. Завжди варто імпортувати.
Даніель Ф

8
І ми повинні використати .toDate()врешті-решт, щоб отримати дату. var end = moment().endOf('day').toDate();
YaTaras

5
додайте .unix()наприкінці, щоб отримати часову moment().startOf('day').unix()
позначку

5
Момент js якось не працює, якщо у мене заздалегідь визначений об'єкт Date, наприклад moment(new Date()).endOf("day");, не працює, але moment().endOf("day");працює.
Б. Кеммер

5
@KlasMellbourn Щоб отримати початок дня в протягом певного часового поясу, ви можете використовувати moment-timezoneі зробити це: moment().tz('America/Chicago').startOf('day').toDate().
Чад Джонсон

8

Використовуючи бібліотеку luxon.js , те ж саме можна досягти, використовуючи методи startOf та endOf, передавши параметр 'day'

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

видаліть .toUTC (), якщо вам потрібен лише місцевий час

і ви можете запитати , почему не moment.js , відповідь тут для цього.



6

Якщо вас просто цікавлять часові позначки в GMT, ви також можете це зробити, які можна зручно адаптувати для різних інтервалів (година:, 1000 * 60 * 6012 годин: 1000 * 60 * 60 * 12тощо).

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

1
Важливий застереження: це працює лише в тому випадку, якщо ви хочете часу в UTC. (Це питання, про яке було задано питання ... але я вважаю, що я повинен попередити всіх, хто прийшов сюди з пошуку в Google і не усвідомлював цього.)
Kip

4

FYI (об'єднана версія Tvanfosson)

він поверне фактичну дату => дата, коли ви викликаєте функцію

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

// як використовувати

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

* застосовується для миттєвого типу часу на Java8, який автоматично перетворює ваш локальний час залежно від вашого регіону (якщо ви плануєте написати глобальний додаток)


0

Я вважаю за краще використовувати бібліотеку date-fns для маніпулювання датою. Це дійсно чудовий модульний і послідовний інструмент. Ви можете розпочати та закінчити день таким чином:

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>


Немає підтримки для обробки UTC.
Добромир Христов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.