¿Cómo comenzar y finalizar el día en Javascript?

271

¿Cómo comenzar (00:00:00) y finalizar (23:59:59) de hoy en la marca de tiempo (GMT)? La computadora usa una hora local.

Bdfy
fuente

Respuestas:

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

Si necesita obtener el tiempo UTC de esos, puede usar UTC().

tvanfosson
fuente
24
Lo recomendaría var end = new Date(start.getTime());para asegurarse de que tiene el mismo punto en el tiempo: en caso de que cambie las fechas entre el inicio y el final de la inicialización, puede suceder, solo un buen hábito para entrar
Martyn Davis
@MartynDavis cuando todo funciona normalmente, generalmente ocurren entre 0 y 2 ticks, pero depende de qué tan ocupada esté la CPU, por lo que tiene sentido hacerlo si le preocupa la precisión de 1 tick.
Jason Sebring
14
También recomendaría usar en setUTCHourslugar de setHoursobtener el tiempo Universal
sidonaldson
2
Es posible que las cosas hayan cambiado, pero para mí esto establece el inicio de UTC para el día anterior y UTC para el día anterior.
David J
55
Por favor, lea el comentario extremadamente importante de @sidonaldson. Usar setHourses peligroso ya que establece las horas locales, en lugar de las horas UTC.
Michael
229

Usando la biblioteca momentjs , esto se puede lograr con los métodos startOf()y endOf()en el objeto de fecha actual del momento, pasando la cadena '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
fuente
22
momentjs es la ventanilla única para todo lo relacionado con el manejo del tiempo de JavaScript. Siempre vale la pena la importación.
Daniel F
8
Y deberíamos usarlo .toDate()al final para obtener la fecha. var end = moment().endOf('day').toDate();
YaTaras
55
agregue .unix()al final para obtener la marca de tiempo de Unix en segundos :) así:moment().startOf('day').unix()
Lukas Liesis
55
moment js de alguna manera no funciona si tengo un objeto Date predefinido, por ejemplo moment(new Date()).endOf("day");, no funciona, pero moment().endOf("day");funciona.
B. Kemmer
55
@KlasMellbourn Para obtener el comienzo del día para una zona horaria especificada, puede utilizar moment-timezoney hacer esto: moment().tz('America/Chicago').startOf('day').toDate().
Chad Johnson
8

Usando la biblioteca luxon.js , se puede lograr lo mismo usando los métodos startOf y endOf pasando el 'día' 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

elimine .toUTC () si solo necesita la hora local

y puedes preguntar por qué no moment.js , la respuesta está aquí para eso.

tk120404
fuente
6

En MomentJs podemos declararlo así:

   const start = moment().format('YYYY-MM-DD 00:00:01');
   const end = moment().format('YYYY-MM-DD 23:59:59');
Ashutosh Jha
fuente
mucho más útil!
Darlan Dieterich el
6

Si solo está interesado en las marcas de tiempo en GMT , también puede hacerlo, que puede adaptarse convenientemente para diferentes intervalos (hora 1000 * 60 * 60, 12 horas 1000 * 60 * 60 * 12, etc.)

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
fuente
1
Advertencia importante: esto solo funciona si desea el tiempo en UTC. (Esto es lo que pedía la pregunta ... pero creo que debería advertir a cualquiera que haya venido de una búsqueda en Google y no se haya dado cuenta de esto.)
Kip
4

FYI (versión fusionada de Tvanfosson)

devolverá la fecha real => fecha cuando está llamando a la función

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

// cómo utilizar

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

* es aplicable para el tipo de hora instantánea en Java8 que convierte su hora local automáticamente según su región (si está planeando, escriba la aplicación global)

Musa
fuente
0

Prefiero usar la biblioteca date-fns para la manipulación de fechas. Es realmente una gran herramienta modular y consistente. Puede comenzar y finalizar el día de esta manera:

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
fuente
No hay soporte para el manejo UTC.
Dobromir Hristov