Aggiunta di ore all’object Date Javascript?

Mi stupisce che l’object Date di Javascript non implementa una funzione di aggiunta di alcun tipo.

Voglio semplicemente una funzione che possa farlo:

var now = Date.now(); var fourHoursLater = now.addHours(4); function Date.prototype.addHours(h) { // how do I implement this? } 

Vorrei semplicemente alcuni suggerimenti in una direzione.

Come questo:

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

Questo sembra davvero un trucco – e funziona anche?

JavaScript ha di per sé terribili API Date / Time. Questo è l’unico modo per farlo in puro JavaScript. Ti consiglio di usare Datejs – come suggerito da Nosredna – se stai facendo un sacco di manipolazioni di date, però.

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

Test:

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

Il codice seguente è di aggiungere 4 ore fino ad oggi (ad esempio la data odierna)

 var today = new Date(); today.setHours(today.getHours() + 4); 

Non causerà errori se si tenta di aggiungere 4 a 23 (consultare i documenti ):

Se un parametro specificato non rientra nell’intervallo previsto, setHours () tenta di aggiornare di conseguenza le informazioni sulla data nell’object Date

Probabilmente è meglio rendere immutabile il metodo addHours restituendo una copia dell’object Date piuttosto che mutandone il parametro.

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

In questo modo puoi concatenare una serie di chiamate di metodo senza preoccuparti dello stato.

La versione suggerita da kennebec non funzionerà quando si passa da o verso l’ora legale, poiché è il numero dell’ora impostato.

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

aggiungerà h ore a this peculiarità indipendente dal sistema temporale. Anche il metodo di Jason Harwig funziona.

È ansible utilizzare il momentjs http://momentjs.com/ Library.

 var moment = require('moment'); foo = new moment(something).add(10, 'm').toDate(); 

C’è un add nella libreria Datejs .

E qui ci sono i metodi di data JavaScript . kennebec ha saggiamente menzionato getHours () e setHours ();

Penso anche che l’object originale non debba essere modificato. Quindi, per salvare la futura manodopera, ecco una soluzione combinata basata su Jason Harwig e Tahir Hasan risponde:

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

Verifica se non è già definito, altrimenti lo definisce sul prototipo Date:

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

Per una semplice funzione aggiungi / sottrai ora / minuto in javascript, prova questo:

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

Questo può essere usato senza parametri per ottenere l'ora corrente

 getTime(); 

o con parametri per ottenere il tempo con i minuti / ore aggiunti

 getTime(1,30); // adds 1.5 hours to current time getTime(2); // adds 2 hours to current time getTime(0,120); // same as above 

anche il tempo negativo funziona

 getTime(-1, -30); // subtracts 1.5 hours from current time 

questa funzione restituisce un array di

 array([Hour], [Minute], [Meridian]) 

Un altro modo per gestire questo è convertire la data in unixtime (epoca), quindi aggiungere l’equivalente in (milli) secondi, quindi ricontrollarla. In questo modo puoi gestire le transizioni di giorno e mese, ad esempio aggiungendo 4 ore a 21, che dovrebbero comportare il giorno successivo, 01:00.