Как получить начало и конец дня в Javascript?

271

Как получить начало (00:00:00) и конец (23:59:59) сегодняшнего дня в метке времени (GMT)? Компьютер использует местное время.

Bdfy
источник

Ответы:

527
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 от них, вы можете использовать UTC().

tvanfosson
источник
24
Я бы порекомендовал, var end = new Date(start.getTime());чтобы у вас был одинаковый момент времени - если вы меняете даты между начальной и конечной инициализацией - это может произойти - просто хорошая привычка
Дэвис
@MartynDavis, когда все в нормальном режиме, между ними обычно происходит около 0-2 тактов, но это зависит от того, насколько занят процессор, поэтому имеет смысл сделать это, если вы беспокоитесь о точности 1 такта.
Джейсон Себринг,
14
Я также рекомендовал бы использовать setUTCHoursвместо того, setHoursчтобы получить Универсальное время
Сидональдсон
2
Все могло измениться, но для меня это устанавливает начало UTC для предыдущего дня и конец UTC для предыдущего дня.
Дэвид Дж
5
Пожалуйста, прочитайте чрезвычайно важный комментарий @ sidonaldson. Использование setHoursопасно, поскольку оно устанавливает локальные часы вместо часов UTC.
Майкл
229

Использование momentjs библиотеки, это может быть достигнуто с startOf()и endOf()методами на текущем объекте даты в тот момент, передавая строку в 'day'качестве аргументов:

Местное время по Гринвичу:

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'); 
chridam
источник
22
momentjs - это универсальное средство для обработки всего, что связано с JavaScript. Всегда стоит импортировать.
Даниэль Ф
8
И мы должны использовать .toDate()в конце, чтобы получить дату. var end = moment().endOf('day').toDate();
YaTaras
5
добавьте .unix()в конце, чтобы получить метку времени Unix в секундах :) вот так:moment().startOf('day').unix()
Lukas Liesis
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, передав в качестве параметра значение «день».

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 , ответ здесь за это.

tk120404
источник
6

В MomentJs мы можем объявить это как:

   const start = moment().format('YYYY-MM-DD 00:00:01');
   const end = moment().format('YYYY-MM-DD 23:59:59');
Ашутош Джа
источник
намного полезнее!
Дарлан Дитрих
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
afinemonkey
источник
1
Важное предупреждение: это работает, только если вы хотите время в UTC. (Это то, что задал вопрос ... но я чувствую, что должен предупредить любого, кто пришел сюда из поиска в Google и не осознал этого.)
Кип
4

К вашему сведению (объединенная версия 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, который автоматически конвертирует ваше местное время в зависимости от вашего региона (если вы планируете написать глобальное приложение)

Musa
источник
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.
Добромир Христов