Adicionando horas ao object JavaScript Date?

Espanta-me que o object Date do JavaScript não implementa uma function add de nenhum tipo.

Eu simplesmente quero uma function que possa fazer isso:

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

Eu simplesmente gostaria de alguns pointers em uma direção.

  • Preciso fazer a análise de string?

  • Posso usar o setTime?

  • Como cerca de milissegundos?

Como isso:

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

Isso parece muito agressivo – e isso funciona?

    O próprio JavaScript tem APIs de data / hora terríveis. Essa é a única maneira de fazer isso em JavaScript puro. Eu recomendaria usar Datejs – como sugerido por Nosredna – se você está fazendo um monte de manipulação de data, no entanto.

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

    Teste:

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

    O código abaixo é para adicionar 4 horas até a data (exemplo a data de hoje)

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

    Isso não causará erro se você tentar adicionar 4 a 23 (consulte os documentos ):

    Se um parâmetro especificado estiver fora do intervalo esperado, setHours () tentará atualizar as informações de data no object Date de acordo

    É provavelmente melhor tornar o método addHours imutável retornando uma cópia do object Date em vez de alterar seu parâmetro.

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

    Dessa forma, você pode encadear várias chamadas de método sem se preocupar com o estado.

    A versão sugerida pelo kennebec falhará ao alterar para ou a partir do horário de verão, já que é o número da hora definido.

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

    irá adicionar horas h para this independente de peculiaridades do sistema de tempo. O método de Jason Harwig também funciona.

    Você pode usar o momentjs http://momentjs.com/ Library.

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

    Há um acréscimo na biblioteca Datejs .

    E aqui estão os methods de data do JavaScript . kennebec sabiamente mencionado getHours () e setHours ();

    Eu também acho que o object original não deve ser modificado. Então, para economizar mão de obra futura, aqui está uma solução combinada baseada nas respostas de Jason Harwig e Tahir Hasan :

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

    Verifique se não está definido, caso contrário, defina-o no protótipo Date:

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

    Para uma function simples de adicionar / subtrair hora / minuto em javascript, tente isto:

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

    Isso pode ser usado sem parâmetros para obter a hora atual

     getTime(); 

    ou com parâmetros para obter o tempo com os minutos / horas adicionados

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

    mesmo tempo negativo funciona

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

    esta function retorna uma matriz de

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

    Outra maneira de lidar com isso é converter a data em unixtime (epoch), adicionar o equivalente em (milli) segundos e convertê-lo de volta. Desta forma, você pode manipular transições de dia e mês, como adicionar 4 horas a 21, o que deve resultar no dia seguinte, 01:00.