web-dev-qa-db-fra.com

Comment ajouter 30 minutes à un objet JavaScript Date?

Je voudrais obtenir un objet Date qui est 30 minutes plus tard qu'un autre objet Date. Comment puis-je le faire avec JavaScript?

690
Morgan Cheng

Utiliser une bibliothèque

Si vous travaillez beaucoup avec les dates, vous voudrez peut-être consulter les bibliothèques de dates JavaScript telles que Datejs ou Moment.js . Par exemple, avec Moment.js, ceci est simplement:

var newDateObj = moment(oldDateObj).add(30, 'm').toDate();

Vanilla Javascript

C'est comme réponse du chaos , mais en une ligne:

var newDateObj = new Date(oldDateObj.getTime() + diff*60000);

diff est la différence en minutes que vous souhaitez du temps de oldDateObj. Cela peut même être négatif.

Ou en tant que fonction réutilisable, si vous devez le faire à plusieurs endroits:

function addMinutes(date, minutes) {
    return new Date(date.getTime() + minutes*60000);
}

Et juste au cas où cela ne serait pas évident, la raison pour laquelle nous multiplions les minutes par 60000 est de convertir les minutes en millisecondes.

Soyez prudent avec Javascript Javascript. Les dates sont difficiles!

Vous pouvez penser que vous pouvez ajouter 24 heures à une date pour obtenir la date de demain, non? faux!

addMinutes(myDate, 60*24); //DO NOT DO THIS

En fin de compte, si l'utilisateur observe l'heure d'été, une journée ne dure pas nécessairement 24 heures. Il y a un jour par an qui ne dure que 23 heures et un jour par an, 25 heures. Par exemple, dans la plupart des États-Unis et du Canada, le 2 novembre 2014, 24 heures après minuit, est toujours le 2 novembre:

const NOV = 10; //because JS months are off by one...
addMinutes(new Date(2014, NOV, 2), 60*24); //In USA, prints 11pm on Nov 2, not 12am Nov 3!

C'est pourquoi utiliser l'une des bibliothèques susmentionnées est un pari plus sûr si vous devez travailler beaucoup avec cela.

Vous trouverez ci-dessous une version plus générique de cette fonction que j'ai écrite. Je recommanderais quand même l’utilisation d’une bibliothèque, mais cela risque d’être excessif/impossible pour votre projet. La syntaxe est modélisée d'après la fonction MySQL DATE_ADD .

/**
 * Adds time to a date. Modelled after MySQL DATE_ADD function.
 * Example: dateAdd(new Date(), 'minute', 30)  //returns 30 minutes from now.
 * https://stackoverflow.com/a/1214753/18511
 * 
 * @param date  Date to start with
 * @param interval  One of: year, quarter, month, week, day, hour, minute, second
 * @param units  Number of units of the given interval to add.
 */
function dateAdd(date, interval, units) {
  if(!(date instanceof Date))
    return undefined;
  var ret = new Date(date); //don't change original date
  var checkRollover = function() { if(ret.getDate() != date.getDate()) ret.setDate(0);};
  switch(String(interval).toLowerCase()) {
    case 'year'   :  ret.setFullYear(ret.getFullYear() + units); checkRollover();  break;
    case 'quarter':  ret.setMonth(ret.getMonth() + 3*units); checkRollover();  break;
    case 'month'  :  ret.setMonth(ret.getMonth() + units); checkRollover();  break;
    case 'week'   :  ret.setDate(ret.getDate() + 7*units);  break;
    case 'day'    :  ret.setDate(ret.getDate() + units);  break;
    case 'hour'   :  ret.setTime(ret.getTime() + units*3600000);  break;
    case 'minute' :  ret.setTime(ret.getTime() + units*60000);  break;
    case 'second' :  ret.setTime(ret.getTime() + units*1000);  break;
    default       :  ret = undefined;  break;
  }
  return ret;
}

Démonstration de jsFiddle .

856
Kip
var d1 = new Date (),
    d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );
212
Jamie
var oldDateObj = new Date();
var newDateObj = new Date();
newDateObj.setTime(oldDateObj.getTime() + (30 * 60 * 1000));
console.log(newDateObj);
143
chaos
var now = new Date();
now.setMinutes(now.getMinutes() + 30); // timestamp
now = new Date(now); // Date object
console.log(now);
93
Teo Graca

Peut-être quelque chose comme ça?

var d = new Date();
var v = new Date();
v.setMinutes(d.getMinutes()+30);

console.log(v)
40
Tyler Carter

Je crée toujours 7 fonctions, pour travailler avec la date en JS: addSeconds, addMinutes, addHours, addDays, addWeeks, addMonths, addYears.

Vous pouvez voir un exemple ici: http://jsfiddle.net/tiagoajacobi/YHA8x/

Comment utiliser:

var now = new Date();
console.log(now.addMinutes(30));
console.log(now.addWeeks(3));

Ce sont les fonctions:

        Date.prototype.addSeconds = function(seconds) {
            this.setSeconds(this.getSeconds() + seconds);
            return this;
        };

        Date.prototype.addMinutes = function(minutes) {
            this.setMinutes(this.getMinutes() + minutes);
            return this;
        };

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

        Date.prototype.addDays = function(days) {
            this.setDate(this.getDate() + days);
            return this;
        };

        Date.prototype.addWeeks = function(weeks) {
            this.addDays(weeks*7);
            return this;
        };

        Date.prototype.addMonths = function (months) {
            var dt = this.getDate();

            this.setMonth(this.getMonth() + months);
            var currDt = this.getDate();

            if (dt !== currDt) {  
                this.addDays(-currDt);
            }

            return this;
        };

        Date.prototype.addYears = function(years) {
            var dt = this.getDate();

            this.setFullYear(this.getFullYear() + years);

            var currDt = this.getDate();

            if (dt !== currDt) {  
                this.addDays(-currDt);
            }

            return this;
        };
30
Jacobi

Le moyen le plus simple de résoudre le problème est de reconnaître que les dates en JavaScript ne sont que des chiffres. Il démarre 0 ou 'Wed Dec 31 1969 18:00:00 GMT-0600 (CST). Chaque 1 représente une milliseconde. Vous pouvez ajouter ou soustraire des millisecondes en obtenant la valeur et en instanciant une nouvelle date à l'aide de cette valeur. Vous pouvez gérer cela assez facilement avec cet esprit.

const minutesToAdjust = 10;
const millisecondsPerMinute = 60000;
const originalDate = new Date('11/20/2017 10:00 AM');
const modifiedDate1 = new Date(originalDate.valueOf() - (minutesToAdjust * millisecondsPerMinute));
const modifiedDate2 = new Date(originalDate.valueOf() + (minutesToAdjust * millisecondsPerMinute));

console.log(originalDate); // Mon Nov 20 2017 10:00:00 GMT-0600 (CST)
console.log(modifiedDate1); // Mon Nov 20 2017 09:50:00 GMT-0600 (CST)
console.log(modifiedDate2); // Mon Nov 20 2017 10:10:00 GMT-0600 (CST)
12
tsacodes

Voici ce que je fais et qui semble bien fonctionner:

Date.prototype.addMinutes = function(minutes) {
    var copiedDate = new Date(this.getTime());
    return new Date(copiedDate.getTime() + minutes * 60000);
}

Ensuite, vous pouvez simplement appeler ceci comme ceci:

var now = new Date();
console.log(now.addMinutes(50));
9
Jonathan

Je pense que beaucoup de réponses ici manquent d'un élément créatif, très nécessaire pour les calculs de voyages dans le temps. Je présente ma solution pour une traduction temporelle de 30 minutes.

(jsfiddle ici )

function fluxCapacitor(n) {
    var delta,sigma=0,beta="ge";
    (function(K,z){

        (function(a,b,c){
            beta=beta+"tT";
            switch(b.shift()) {
                case'3':return z('0',a,c,b.shift(),1);
                case'0':return z('3',a,c,b.pop());
                case'5':return z('2',a,c,b[0],1);
                case'1':return z('4',a,c,b.shift());
                case'2':return z('5',a,c,b.pop());
                case'4':return z('1',a,c,b.pop(),1);
            }
        })(K.pop(),K.pop().split(''),K.pop());
    })(n.toString().split(':'),function(b,a,c,b1,gamma){
       delta=[c,b+b1,a];sigma+=gamma?3600000:0; 
       beta=beta+"im";
    });
    beta=beta+"e";
    return new Date (sigma+(new Date( delta.join(':')))[beta]());
}
5
unsynchronized

Voici la version ES6:

let getTimeAfter30Mins = () => {
  let timeAfter30Mins = new Date();
  timeAfter30Mins = new Date(timeAfter30Mins.setMinutes(timeAfter30Mins.getMinutes() + 30));
};

Appelez ça comme:

getTimeAfter30Mins();
5
student

Utilisez une bibliothèque existante connue pour gérer les bizarreries impliquées dans le traitement des calculs de temps. Mon favori actuel est moment.js .

<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.js"></script>
<script>
 var now = moment(); // get "now"
 console.log(now.toDate()); // show original date
 var thirty = moment(now).add(30,"minutes"); // clone "now" object and add 30 minutes, taking into account weirdness like crossing DST boundries or leap-days, -minutes, -seconds.
 console.log(thirty.toDate()); // show new date
</script>
2
Ouroborus

Juste une autre option, que j'ai écrite:

Bibliothèque DP_DateExtensions

C'est exagéré si c'est tout le traitement de la date dont vous avez besoin, mais il fera ce que vous voulez.

Prend en charge le formatage date/heure, le calcul mathématique de la date (ajout/soustraction d'éléments de date), la comparaison de date, l'analyse de la date, etc. Il est généreusement ouvert.

1
Jim Davis

Pour les paresseux comme moi:

La réponse de Kip (ci-dessus) dans coffeescript, en utilisant un "enum" et opérant sur le même objet:

Date.UNIT =
  YEAR: 0
  QUARTER: 1
  MONTH: 2
  WEEK: 3
  DAY: 4
  HOUR: 5
  MINUTE: 6
  SECOND: 7
Date::add = (unit, quantity) ->
  switch unit
    when Date.UNIT.YEAR then @setFullYear(@getFullYear() + quantity)
    when Date.UNIT.QUARTER then @setMonth(@getMonth() + (3 * quantity))
    when Date.UNIT.MONTH then @setMonth(@getMonth() + quantity)
    when Date.UNIT.WEEK then @setDate(@getDate() + (7 * quantity))
    when Date.UNIT.DAY then @setDate(@getDate() + quantity)
    when Date.UNIT.HOUR then @setTime(@getTime() + (3600000 * quantity))
    when Date.UNIT.MINUTE then @setTime(@getTime() + (60000 * quantity))
    when Date.UNIT.SECOND then @setTime(@getTime() + (1000 * quantity))
    else throw new Error "Unrecognized unit provided"
  @ # for chaining
1
Blaskovicz