Como obter o início e o fim do dia em Javascript?

271

Como começar (00:00:00) e terminar (23:59:59) de hoje no horário (GMT)? O computador usa uma hora local.

Bdfy
fonte

Respostas:

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

Se você precisar obter a hora UTC, pode usar UTC().

tvanfosson
fonte
24
Eu recomendaria que var end = new Date(start.getTime());para garantir que você tem mesmo ponto no tempo - no caso de você mudar datas entre início e final de inicialização - pode acontecer - apenas um bom hábito de entrar
Martyn Davis
@MartynDavis, quando tudo está em operação normal, geralmente cerca de 0-2 ticks acontecem no meio, mas depende de quão ocupada a CPU está, então faz sentido fazer isso se você estiver preocupado com a precisão de 1 tick.
21817 Jason Sebring
14
Também gostaria de recomendar utilizando setUTCHours, em vez de setHourster tempo Universal
sidonaldson
2
As coisas podem ter mudado, mas para mim isso define o início do UTC para o dia anterior e o UTC para o dia anterior.
David J
5
Por favor, leia o comentário extremamente importante de @ sidonaldson. O uso setHoursé perigoso, pois define o horário local, em vez do horário UTC.
Michael
229

Usando a biblioteca momentjs , isso pode ser alcançado com os métodos startOf()e endOf()no objeto date atual do momento, passando a string 'day'como argumentos:

GMT local:

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

Para UTC:

var start = moment.utc().startOf('day'); 
var end = moment.utc().endOf('day'); 
chridam
fonte
22
O momentjs é o balcão único para todas as coisas relacionadas à manipulação de tempo do JavaScript. Sempre vale a pena a importação.
Daniel F
8
E devemos usar .toDate()no final para obter a data. var end = moment().endOf('day').toDate();
YaTaras
5
adicione .unix()no final para obter o timestamp do unix em segundos :) assim:moment().startOf('day').unix()
Lukas Liesis
5
moment js de alguma forma não funciona se eu tiver um objeto Date predefinido, por exemplo moment(new Date()).endOf("day");, não funciona, mas moment().endOf("day");funciona.
B. Kemmer
5
@KlasMellbourn Para obter o início do dia para um fuso horário especificado, você pode usar moment-timezonee fazer isso: moment().tz('America/Chicago').startOf('day').toDate().
Chad Johnson
8

Usando a biblioteca luxon.js , o mesmo pode ser alcançado usando os métodos startOf e endOf passando o 'dia' como parâmetro

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

remova .toUTC () se você precisar apenas da hora local

e você pode perguntar por que não moment.js , a resposta está aqui para isso.

tk120404
fonte
6

Em MomentJs, podemos declarar como:

   const start = moment().format('YYYY-MM-DD 00:00:01');
   const end = moment().format('YYYY-MM-DD 23:59:59');
Ashutosh Jha
fonte
muito mais útil!
Darlan Dieterich
6

Se você está interessado apenas em carimbos de data e hora no GMT, também pode fazer isso, que pode ser convenientemente adaptado para diferentes intervalos (hora:, 1000 * 60 * 6012 horas: 1000 * 60 * 60 * 12etc.)

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
fonte
1
Advertência importante: isso só funciona se você deseja o horário no UTC. (Isto é o que a pergunta feita por ... mas eu sinto que eu deveria avisar ninguém que veio de uma pesquisa no Google e não percebeu isso.)
Kip
4

FYI (versão mesclada do Tvanfosson)

retornará data real => data em que você está chamando a função

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

// Como usar

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

* é aplicável ao tipo de hora Instantânea no Java8, que converte sua hora local automaticamente, dependendo da sua região. (se você estiver planejando escrever um aplicativo global)

musa
fonte
0

Eu prefiro usar a biblioteca date-fns para manipular a data. É realmente uma ótima ferramenta modular e consistente. Você pode começar e terminar o dia desta maneira:

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>

Mikhail Shabrikov
fonte
Não há suporte para manipulação de UTC.
Dobromir Hristov