Agregar horas a un objeto de fecha de JavaScript

5 minutos de lectura

avatar de usuario
jeff albóndiga yang

Me sorprende que el objeto Fecha 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

  • ¿Dónde sueles poner este código? al inicio de la aplicación?

    – Lun

    16 de julio de 2020 a las 19:18

  • Una solución concisa que contamina el prototipo, esto hubiera sido mejor utilizado como una función.

    – Maxie Berkman

    29 de septiembre de 2020 a las 13:29

  • @TimWißmann Buen punto, sin embargo, es posible que el OP o las personas que visitan esa página no sepan que es una mala práctica que puede generar problemas en el futuro.

    – Maxie Berkman

    2 de noviembre de 2020 a las 19:04

  • Creo que al menos verificar si Date.prototype.addHours ya estaba allí, habría sido obligatorio el sentido común. if(!Date.prototype.addHours) Más allá de eso, supongo que a algunas personas simplemente les gusta meter los dedos en los prototipos 👉👌

    – MayTheSForceBeWithYou

    25 de noviembre de 2020 a las 1:14


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
tahir hassan

Probablemente sea mejor hacer que el método addHours sea inmutable devolviendo una copia del objeto Date en lugar de mutar su parámetro.

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

De esta manera, puede encadenar un montón de llamadas a métodos sin preocuparse por el estado.

  • Esta función tiene los mismos problemas que se indican aquí stackoverflow.com/questions/1050720/… No se trata realmente de si funciona en ciertos navegadores, pero otros lugares que usan Javascript ven esto como un problema. combinar su solución con esta stackoverflow.com/a/1050782/295535 parece ser la mejor solución

    – Ressu

    10 de diciembre de 2012 a las 6:55


  • Debería considerar cambiar el nombre de la función, ya que la palabra add* se usa comúnmente para mutar el objeto en sí.

    – mr5

    11 de mayo de 2017 a las 3:47


  • @ mr5 – no estoy seguro de eso, add se utiliza en el marco .NET DateTime clase mucho, y tiene el mismo significado que el + (más) en Matemáticas.

    – Tahir Hasan

    12 de mayo de 2017 a las 8:43

  • currentDate.addHours(1) <- Desde mi instinto de programación, estoy esperando el currentDate valor para cambiar, pero en su implementación, no lo haría. En cuanto a por qué estoy sugiriendo cambiar el nombre o cambiar su firma a algo

    – mr5

    12 de mayo de 2017 a las 9:04


  • @TahirHassan no tiene nada que ver con los detalles técnicos, sino con elegir la palabra correcta para el nombre de la función. Todavía prefiero la versión mutable cuando la función tiene el prefijo add

    – mr5

    26 de mayo de 2017 a las 7:56

¿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