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?
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;
}
Date.prototype.addHours= function(h){
this.setHours(this.getHours()+h);
return this;
}
Tester:
alert(new Date().addHours(4));
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.
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.
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.
Vous pouvez utiliser le momentjs http://momentjs.com/ Library.
var moment = require('moment');
foo = new moment(something).add(10, 'm').toDate();
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;
}
Il y a un ajout dans Datejs library.
Et voici les méthodes de date JavaScript . Kennebec a judicieusement mentionné getHours () et setHours ();
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;
};
}
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])
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.
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
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))));