web-dev-qa-db-fra.com

Ajouter des heures à l'objet Date de Javascript?

Cela m'étonne que l'objet Date de Javascript n'implémente aucune fonction d'ajout.

Je veux simplement une fonction qui peut faire ça:

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

function Date.prototype.addHours(h) {

   // how do I implement this?  

}

Je voudrais simplement quelques indications dans une direction.

  • Dois-je analyser les chaînes? 

  • Puis-je utiliser setTime?

  • Que diriez-vous de millisecondes?

Comme ça:

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

Cela semble vraiment bidon - et est-ce que ça marche?

311
Jeff Meatball Yang

JavaScript lui-même a des API Date/Time terribles. C'est la seule façon de le faire en JavaScript pur. Je recommanderais d'utiliser Datejs - comme suggéré par Nosredna - si vous manipulez beaucoup de dates, cependant.

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

Tester:

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

Le code ci-dessous ajoute 4 heures à ce jour (exemple: date du jour)

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

Cela ne causera pas d'erreur si vous essayez d'ajouter 4 à 23 (voir la docs ):

Si un paramètre que vous spécifiez est en dehors de la plage attendue, setHours () tente de mettre à jour les informations de date dans l'objet Date en conséquence.

94
SuperNova

Il est probablement préférable de rendre la méthode addHours immuable en renvoyant une copie de l'objet Date plutôt que de muter son paramètre.

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

De cette façon, vous pouvez chaîner un ensemble d'appels de méthode sans vous soucier de l'état.

38
Tahir Hassan

La version suggérée par kennebec échouera lors du passage à ou depuis l’heure d’été, car c’est le nombre d’heures défini. 

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

ajoutera h heures à this indépendamment des particularités du système temporel ... La méthode de Jason Harwig fonctionne également.

17
petter

Vous pouvez utiliser le momentjs http://momentjs.com/ Library.

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

Je pense aussi que l'objet original ne devrait pas être modifié. Donc, pour économiser les effectifs futurs, voici une solution combinée basée sur Jason Harwig's et Tahir Hasan réponses:

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

Il y a un ajout dans Datejs library.

Et voici les méthodes de date JavaScript . Kennebec a judicieusement mentionné getHours () et setHours ();

6
Nosredna

Vérifiez si ce n'est pas déjà défini, sinon le définit sur le prototype Date:

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

Pour une simple fonction addition/soustraction heure/minute en javascript, essayez ceci:

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

Ceci peut être utilisé sans paramètres pour obtenir l'heure actuelle

getTime();

ou avec des paramètres pour obtenir l'heure avec les minutes/heures ajoutées

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

même le temps négatif fonctionne

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

cette fonction retourne un tableau de 

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

Une autre méthode consiste à convertir la date en unixtime (Epoch), puis d’ajouter l’équivalent en (millisecondes), puis de la reconvertir. De cette façon, vous pouvez gérer les transitions du jour et du mois, comme l’ajout de 4 heures à 21 heures, ce qui devrait se traduire par le jour suivant, 01:00. 

2
SPRBRN

Un peu brouillon, mais ça marche!

Étant donné un format de date comme celui-ci: 2019-04-03T15: 58

  //Get the start date.
  var start = $("#start_date").val();
  //Split the date and time.
  var startarray = start.split("T");
  var date = startarray[0];
  var time = startarray[1];

  //Split the hours and minutes.
  var timearray = time.split(":");

  var hour = timearray[0];
  var minute = timearray[1];
  //Add an hour to the hour.
  hour++;
  //$("#end_date").val = start;
  $("#end_date").val(""+date+"T"+hour+":"+minute+"");

Votre sortie serait: 2019-04-03T16: 58

0
Captain Sponge

SPRBRN est correct. Afin de prendre en compte le début/la fin du mois et de l’année, vous devez convertir au format Epoch et inversement.

Voici comment vous faites cela:

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


ou faites-le en une ligne (où les noms de variables sont les mêmes que ci-dessus:

var newDate = 
    new Date(startDate.getTime() + millisecond + 
        1000 * (sec + 60 * (min + 60 * (hours + 24 * days))));
0
JED