¿Cómo agregar horas a un objeto Fecha?

3 minutos de lectura

avatar de usuario
jeff albóndiga yang

Me sorprende que el objeto Date de JavaScript no implemente una función de adición de ningún tipo.

Simplemente quiero una función que pueda hacer esto:

var now = Date.now();
var fourHoursLater = now.addHours(4);

function Date.prototype.addHours(h) {

   // How do I implement this?

}

Simplemente me gustaría algunos punteros en una dirección.

  • ¿Necesito hacer un análisis de cadenas?

  • ¿Puedo usar setTime?

  • ¿Qué tal milisegundos?

Me gusta esto:

new Date(milliseconds + 4*3600*1000 /* 4 hours in ms */)?

Sin embargo, esto parece realmente pirateado, ¿e incluso funciona?

avatar de usuario
jason harwig

JavaScript en sí mismo tiene terribles API de Fecha/Hora. No obstante, puedes hacer esto en JavaScript puro:

Date.prototype.addHours = function(h) {
  this.setTime(this.getTime() + (h*60*60*1000));
  return this;
}

  • si, por ejemplo, estuviera agregando una hora haciendo que se pasara al día siguiente, ¿lo atraparía e incrementaría todo correctamente (día, mes, año)?

    – cdoern

    14 mayo 2020 a las 16:40

  • @cdoern Creo que sí, ya que getTime() devolverá milisegundos y solo agregas más milisegundos a eso

    – El1993

    3 de junio de 2020 a las 7:21

  • Funciona perfectamente en 2022! Gracias !

    –Marc Berger

    hace 36 minutos

avatar de usuario
kennebec

Date.prototype.addHours= function(h){
    this.setHours(this.getHours()+h);
    return this;
}

Prueba:

alert(new Date().addHours(4));

  • No creo que esto funcione — ¿pruébalo en algo con la hora 23, por ejemplo? La respuesta de Jason Harwig es lo que me vino a la mente.

    – Domenic

    25 de octubre de 2010 a las 16:08

  • Es una mala práctica agregar cosas a un prototipo de objeto en Javascript, y Domenic tiene razón, esto no funciona. La solución de Jason Harwig a continuación es mejor.

    – iKode

    6 de julio de 2012 a las 12:43

  • @Domenic Esto funciona bien a las 23:00, probado dentro de la consola de JavaScript de Firefox 10, Chrome 21 e IE 8/9 Aquí el código que he usado para probar: var date = new Date(2012, 10, 22, 23, 0, 1); date.toString(); // Thu Nov 22 2012 23:00:01 GMT+0100 (CET) date.setHours(date.getHours() + 1); date.toString(); // Fri Nov 23 2012 00:00:01 GMT+0100 (CET) También funciona bien con setMinutes()

    – tanguy_k

    22 de noviembre de 2012 a las 0:19


  • Me encontré con problemas con esta solución: el aumento en 1 falló para mí en el punto de cambio de DST (adelante el reloj una hora).

    – andrewb

    2 de octubre de 2015 a las 2:09

  • También me mordió esto: estaba recorriendo horas usando setHours (getHours-1): ahora, en la primera hora de horario de verano, esto termina siendo un bucle infinito. Entonces, ¡comprueba el resultado!

    – cfstras

    14 de marzo de 2016 a las 12:57


avatar de usuario
Pedro Mortensen

La versión sugerida por kennebec fallará al cambiar a o desde horario de veranoya que es el número de hora el que se configura.

this.setUTCHours(this.getUTCHours()+h);

agregará h horas para this independiente de las peculiaridades del sistema de tiempo.

El método de Jason Harwig también funciona.

  • No creo que esto funcione — ¿pruébalo en algo con la hora 23, por ejemplo? La respuesta de Jason Harwig es lo que me vino a la mente.

    – Domenic

    25 de octubre de 2010 a las 16:08

  • Es una mala práctica agregar cosas a un prototipo de objeto en Javascript, y Domenic tiene razón, esto no funciona. La solución de Jason Harwig a continuación es mejor.

    – iKode

    6 de julio de 2012 a las 12:43

  • @Domenic Esto funciona bien a las 23:00, probado dentro de la consola de JavaScript de Firefox 10, Chrome 21 e IE 8/9 Aquí el código que he usado para probar: var date = new Date(2012, 10, 22, 23, 0, 1); date.toString(); // Thu Nov 22 2012 23:00:01 GMT+0100 (CET) date.setHours(date.getHours() + 1); date.toString(); // Fri Nov 23 2012 00:00:01 GMT+0100 (CET) También funciona bien con setMinutes()

    – tanguy_k

    22 de noviembre de 2012 a las 0:19


  • Me encontré con problemas con esta solución: el aumento en 1 falló para mí en el punto de cambio de DST (adelante el reloj una hora).

    – andrewb

    2 de octubre de 2015 a las 2:09

  • También me mordió esto: estaba recorriendo horas usando setHours (getHours-1): ahora, en la primera hora de horario de verano, esto termina siendo un bucle infinito. Entonces, ¡comprueba el resultado!

    – cfstras

    14 de marzo de 2016 a las 12:57


avatar de usuario
Justicia Selorm Bruce

Creo que esto debería hacer el truco.

 var nextHour  = Date.now() + 1000 * 60 * 60;

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad