sumar - obtener fecha y hora actual javascript
¿Agregando horas al objeto de fecha de Javascript? (12)
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 cadena?
¿Puedo usar setTime?
¿Qué tal milisegundos?
Me gusta esto:
new Date(milliseconds + 4*3600*1000 /*4 hrs in ms*/)?
Sin embargo, esto parece realmente hacker, ¿e incluso funciona?
Compruebe si no está definido, de lo contrario, lo define en el prototipo Fecha:
if (!Date.prototype.addHours) {
Date.prototype.addHours = function(h) {
this.setHours(this.getHours() + h);
return this;
};
}
El código a continuación es agregar 4 horas a la fecha (ejemplo de la fecha de hoy)
var today = new Date();
today.setHours(today.getHours() + 4);
No provocará errores si intenta agregar de 4 a 23 (consulte la docs ):
Si un parámetro que usted especifica está fuera del rango esperado, setHours () intenta actualizar la información de fecha en el objeto Date en consecuencia
Hay un complemento en la biblioteca de Datejs .
Y aquí están los métodos de fecha de JavaScript . kennebec sabiamente mencionó getHours () y setHours ();
JavaScript en sí tiene terribles API de fecha / hora. Esta es la única manera de hacerlo en JavaScript puro. Sin Datejs , recomiendo usar Datejs , como sugiere Nosredna, si estás haciendo mucha manipulación de citas.
Date.prototype.addHours = function(h) {
this.setTime(this.getTime() + (h*60*60*1000));
return this;
}
La versión sugerida por kennebec fallará cuando se cambie ao desde DST, ya que es el número de hora que se establece.
this.setUTCHours(this.getUTCHours()+h);
Agregará h
horas a this
independiente de las peculiaridades del sistema de tiempo. El método de Jason Harwig también funciona.
Otra forma de manejar esto es convertir la fecha a unixtime (época), luego agregar el equivalente en (mili) segundos y luego convertirla de nuevo. De esta manera puede manejar las transiciones del día y del mes, como agregar 4 horas a 21, lo que debería resultar en el día siguiente, 01:00.
Para una función simple de agregar / restar hora / minuto en javascript, intente esto:
function getTime (addHour, addMin){
addHour = (addHour?addHour:0);
addMin = (addMin?addMin:0);
var time = new Date(new Date().getTime());
var AM = true;
var ndble = 0;
var hours, newHour, overHour, newMin, overMin;
//change form 24 to 12 hour clock
if(time.getHours() >= 13){
hours = time.getHours() - 12;
AM = (hours>=12?true:false);
}else{
hours = time.getHours();
AM = (hours>=12?false:true);
}
//get the current minutes
var minutes = time.getMinutes();
// set minute
if((minutes+addMin) >= 60 || (minutes+addMin)<0){
overMin = (minutes+addMin)%60;
overHour = Math.floor((minutes+addMin-Math.abs(overMin))/60);
if(overMin<0){
overMin = overMin+60;
overHour = overHour-Math.floor(overMin/60);
}
newMin = String((overMin<10?''0'':'''')+overMin);
addHour = addHour+overHour;
}else{
newMin = minutes+addMin;
newMin = String((newMin<10?''0'':'''')+newMin);
}
//set hour
if(( hours+addHour>=13 )||( hours+addHour<=0 )){
overHour = (hours+addHour)%12;
ndble = Math.floor(Math.abs((hours+addHour)/12));
if(overHour<=0){
newHour = overHour+12;
if(overHour == 0){
ndble++;
}
}else{
if(overHour ==0 ){
newHour = 12;
ndble++;
}else{
ndble++;
newHour = overHour;
}
}
newHour = (newHour<10?''0'':'''')+String(newHour);
AM = ((ndble+1)%2===0)?AM:!AM;
}else{
AM = (hours+addHour==12?!AM:AM);
newHour = String((Number(hours)+addHour<10?''0'':'''')+(hours+addHour));
}
var am = (AM)?''AM'':''PM'';
return new Array(newHour, newMin, am);
};
Esto se puede utilizar sin parámetros para obtener la hora actual
getTime();
o con parámetros para obtener el tiempo con los minutos / horas añadidos
getTime(1,30); // adds 1.5 hours to current time
getTime(2); // adds 2 hours to current time
getTime(0,120); // same as above
incluso el tiempo negativo funciona
getTime(-1, -30); // subtracts 1.5 hours from current time
esta función devuelve una matriz de
array([Hour], [Minute], [Meridian])
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.
Puede utilizar la biblioteca momentms http://momentjs.com/ .
var moment = require(''moment'');
foo = new moment(something).add(10, ''m'').toDate();
SPRBRN es correcto. Para tener en cuenta el inicio / fin de mes y año, debe convertir a Epoch y viceversa.
Así es como haces eso:
var milliseconds = 0; //amount of time from current date/time
var sec = 0; //(+): future
var min = 0; //(-): past
var hours = 2;
var days = 0;
var startDate = new Date(); //start date in local time (we''ll use current time as an example)
var time = startDate.getTime(); //convert to milliseconds since epoch
//add time difference
var newTime = time + milliseconds + (1000*sec) + (1000*60*min) + (1000*60*60*hrs) + (1000*60*60*24)
var newDate = new Date(newTime);//convert back to date; in this example: 2 hours from right now
o hazlo en una línea (donde los nombres de las variables son los mismos que los anteriores)
var newDate =
new Date(startDate.getTime() + millisecond +
1000 * (sec + 60 * (min + 60 * (hours + 24 * days))));
También creo que el objeto original no debe ser modificado. Así que para ahorrar mano de obra futura, aquí hay una solución combinada basada en las respuestas de Jason Harwig y Tahir Hasan :
Date.prototype.addHours= function(h){
var copiedDate = new Date();
copiedDate.setTime(this.getTime() + (h*60*60*1000));
return copiedDate;
}
Date.prototype.addHours= function(h){
this.setHours(this.getHours()+h);
return this;
}
Prueba:
alert(new Date().addHours(4));