Comment soustraire des minutes d'une date en javascript?


134

Comment puis-je traduire ce pseudo code en js fonctionnels [ne vous inquiétez pas de la provenance de la date de fin, sauf que c'est une date javascript valide].

var myEndDateTime = somedate;  //somedate is a valid js date  
var durationInMinutes = 100; //this can be any number of minutes from 1-7200 (5 days)

//this is the calculation I don't know how to do
var myStartDate = somedate - durationInMuntes;

alert("The event will start on " + myStartDate.toDateString() + " at " + myStartDate.toTimeString());

Réponses:


200

Une fois que vous savez ceci:

  • Vous pouvez créer un Dateen appelant le constructeur avec des millisecondes depuis le 1er janvier 1970.
  • Le valueOf()aDate est le nombre de millisecondes depuis le 1er janvier 1970
  • Il y a des 60,000millisecondes dans une minute: -]

... ce n'est pas si difficile.

Dans le code ci-dessous, un nouveau Dateest créé en soustrayant le nombre approprié de millisecondes de myEndDateTime:

var MS_PER_MINUTE = 60000;
var myStartDate = new Date(myEndDateTime - durationInMinutes * MS_PER_MINUTE);

6
Mais ne gère pas lorsque vous ajoutez des minutes. Pour gérer correctement lorsque vous ajoutez des minutes, vous devez utiliser .getTime(). Exemple:var myStartDate = new Date(myEndDateTime.getTime() + durationInMinutes * MS_PER_MINUTE);
Gabriel L. Oliveira

Vous pouvez également utiliser var myStartDate = somedate.addMinutes(-durationInMuntes);Je suppose que somedate est un objet Date
kubahaha

1
Cela fonctionne ... mais vous avez une question à savoir que le constructeur Date () a 3 options, à savoir 1: vide 2: chaîne et 3: Numéro année, Numéro mois .... donc celui utilisé ci-dessus suit quel constructeur?
Zafar


Pour un exemple de la façon dont cela peut mal tourner, en utilisant Europe / Londres comme lieu du fuseau horaire: var d = new Date("2017-10-29 01:50:00"), e = new Date(d.getTime() + 20 * 60000);vous vous attendez eà ce que ce soit 02:10:00, non? Nan. 01:10:00. DST dit bonjour. Et puis il y a des secondes
intercalaires

81

Vous pouvez également utiliser get and set minutes pour y parvenir:

var endDate = somedate;

var startdate = new Date(endDate);

var durationInMinutes = 20;

startdate.setMinutes(endDate.getMinutes() - durationInMinutes);

52
il est à noter que setMinutes()c'est assez intelligent pour gérer correctement les minutes négatives. Donc , si la date de départ était 03h05, et que vous voulez soustraire 30 minutes, vous seriez de passage dans -25la setMinutes (), ce qui est assez intelligent pour savoir que 3:-25c'est 2:35. (c'est-à-dire qu'il ne jette pas d'exception.)
Kip

2
@Kip - Merci, c'est la perspicacité qui rend cette réponse intéressante. Mais est-ce que tous les navigateurs le garantissent? Je demande parce que MDN dit que seuls 0 - 59 sont autorisés - mais je soupçonne que les documents sont tout simplement faux dans ce cas? Voir: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...
Justin Ethier

Cela m'a été plus utile, je voulais soustraire l'heure d'une instance d'objet Date existante qui a été configurée d'une manière particulière via le constructeur. Je vous remercie!
Bill Effin Murray

1
N'oubliez pas que la .setMinutes(...)force gère les intvaleurs. Si vous définissez 1.5 minutesdans a, Dateil ne sera défini 1 minuteet gardera les secondes comme avant.
Gabriel L. Oliveira

J'avais de mauvaises valeurs dans un cas d'utilisation similaire lorsque j'ai essayé startDate = endDate. On dirait le problème où une copie superficielle se produit
raghav710

35

Tout n'est que des tiques, pas besoin de mémoriser les méthodes ...

var aMinuteAgo = new Date( Date.now() - 1000 * 60 );

ou

var aMinuteLess = new Date( someDate.getTime() - 1000 * 60 );

mettre à jour

Après avoir travaillé avec momentjs, je dois dire que c'est une bibliothèque incroyable que vous devriez consulter. Il est vrai que les ticks fonctionnent dans de nombreux cas, ce qui rend votre code très petit et vous devriez essayer de rendre votre code aussi petit que possible pour ce que vous devez faire. Mais pour tout ce qui est compliqué, utilisez momentjs.


2
IMO ce n'est pas si simple. Il faut quelques efforts pour décrypter ce que fait réellement ce code. La meilleure approche consiste à intégrer ce type de logique dans une fonction.
sszarek

12

moment.js a de très bonnes méthodes pratiques pour manipuler les objets de date

le méthode .subtract , vous permet de soustraire un certain nombre d'unités de temps à une date, en fournissant le montant et une chaîne d'unité de temps.

var now = new Date();
// Sun Jan 22 2017 17:12:18 GMT+0200 ...
var olderDate = moment(now).subtract(3, 'minutes').toDate();
// Sun Jan 22 2017 17:09:18 GMT+0200 ...

6

Voici ce que j'ai trouvé:

//First, start with a particular time
var date = new Date();

//Add two hours
var dd = date.setHours(date.getHours() + 2);

//Go back 3 days
var dd = date.setDate(date.getDate() - 3);

//One minute ago...
var dd = date.setMinutes(date.getMinutes() - 1);

//Display the date:
var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var date = new Date(dd);
var day = date.getDate();
var monthIndex = date.getMonth();
var year = date.getFullYear();
var displayDate = monthNames[monthIndex] + ' ' + day + ', ' + year;
alert('Date is now: ' + displayDate);

Sources:

http://www.javascriptcookbook.com/article/Perform-date-manipulations-based-on-adding-or-subtracting-time/

https://stackoverflow.com/a/12798270/1873386


5
var date=new Date();

//here I am using "-30" to subtract 30 minutes from the current time.
var minute=date.setMinutes(date.getMinutes()-30); 

console.log(minute) //it will print the time and date according to the above condition in Unix-timestamp format.

vous pouvez convertir l'horodatage Unix en heure conventionnelle en utilisant new Date().par exemple

var extract=new Date(minute)
console.log(minute)//this will print the time in the readable format.

J'ai fait quelques changements de formatage. Veuillez vous assurer qu'il reflète toujours ce que vous aviez l'intention de publier.
adiga

1

Essayez comme ci-dessous:

var dt = new Date();
dt.setMinutes( dt.getMinutes() - 20 );
console.log('#####',dt);

0

C'est ce que j'ai fait: voir sur Codepen

var somedate = 1473888180593;
var myStartDate;
//var myStartDate = somedate - durationInMuntes;

myStartDate = new Date(dateAfterSubtracted('minutes', 100));

alert("The event will start on " + myStartDate.toDateString() + " at " + myStartDate.toTimeString());

function dateAfterSubtracted(range, amount){
    var now = new Date();
    if(range === 'years'){
        return now.setDate(now.getYear() - amount);
    }
    if(range === 'months'){
        return now.setDate(now.getMonth() - amount);
    }
    if(range === 'days'){
        return now.setDate(now.getDate() - amount);
    }
    if(range === 'hours'){
        return now.setDate(now.getHours() - amount);
    }
    if(range === 'minutes'){
        return now.setDate(now.getMinutes() - amount);
    }
    else {
        return null;
    }
}

OP ne l'utilise pas new Date(), mais a une date spécifiée, et n'a demandé que la soustraction de minutes. De plus, votre code ne fonctionne pas - il renvoie l'horodatage UNIX au lieu de l'objet Date.
Michał Perłakowski

0

Étendre la classe Date avec cette fonction

// Add (or substract if value is negative) the value, expresed in timeUnit
// to the date and return the new date.
Date.dateAdd = function(currentDate, value, timeUnit) {

    timeUnit = timeUnit.toLowerCase();
    var multiplyBy = { w:604800000,
                     d:86400000,
                     h:3600000,
                     m:60000,
                     s:1000 };
    var updatedDate = new Date(currentDate.getTime() + multiplyBy[timeUnit] * value);

    return updatedDate;
};

Ainsi, vous pouvez ajouter ou soustraire un nombre de minutes, secondes, heures, jours ... à n'importe quelle date.

add_10_minutes_to_current_date = Date.dateAdd( Date(), 10, "m");
subs_1_hour_to_a_date = Date.dateAdd( date_value, -1, "h");
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.