Comment arrondir/arrondir un momentjs moment à la minute la plus proche?
J'ai vérifié le docs , mais il ne semble pas y avoir de méthode pour cela.
Notez que je ne veux pas d'une chaîne arrondie à la minute la plus proche, je veux un moment
retourné (ou modifié à la place, c'est bien). Je préfère ne pas avoir à convertir en chaîne, et la reconvertir aussi.
Merci.
Comme demandé, voici un code:
var now = new moment(new Date());
if (now.seconds() > 0) {
now.add('minutes', -1);
}
now.seconds(0);
comme vous pouvez le voir, j'ai réussi à arrondir manuellement le moment ici, mais cela semble plutôt hacky. Juste après une manière plus élégante d'accomplir cela.
Pour arrondir, vous devez ajouter une minute, puis arrondir vers le bas . Pour arrondir, utilisez simplement la méthode startOf
.
Notez l'utilisation d'un opérateur ternaire pour vérifier si l'heure doit être arrondie ( par exemple, 13:00:00 sur le point n'a pas besoin d'être arrondie ).
var m = moment('2017-02-17 12:01:01');
var roundDown = m.startOf('minute');
console.log(roundDown.toString()); // outputs Tue Feb 17 2017 12:01:00 GMT+0000
var m = moment('2017-02-17 12:01:01');
var roundUp = m.second() || m.millisecond() ? m.add(1, 'minute').startOf('minute') : m.startOf('minute');
console.log(roundUp.toString()); // outputs Tue Feb 17 2017 12:02:00 GMT+0000
var m = moment('2017-02-17 12:59:59');
var roundDown = m.startOf('hour');
console.log(roundDown.toString()); // outputs Tue Feb 17 2017 12:00:00 GMT+0000
var m = moment('2017-02-17 12:59:59');
var roundUp = m.minute() || m.second() || m.millisecond() ? m.add(1, 'hour').startOf('hour') : m.startOf('hour');
console.log(roundUp.toString()); // outputs Tue Feb 17 2017 13:00:00 GMT+0000
Réponse partielle:
Pour arrondir à la minute près:
var m = moment();
m.startOf('minute');
Cependant, l'équivalent pour l'arrondi, endOf
, ne donne pas tout à fait le résultat attendu.
La fonction roundTo pourrait en faire une future version.
Exemples:
moment().roundTo('minute', 15); // output: 12:45
moment().roundTo('minute', 15, 'down'); // output: 12:30
L'arrondi à l'heure la plus proche peut être obtenu en ajoutant une demi-heure, puis en exécutant .startOf ('hour'). C'est la même chose pour toute mesure de temps.
var now = moment();
// -> Wed Sep 30 2015 11:01:00
now.add(30, 'minutes').startOf('hour'); // -> Wed Sep 30 2015 11:31:00
// -> Wed Sep 30 2015 11:00:00
var now = moment();
// -> Wed Sep 30 2015 11:31:00
now.add(30, 'minutes').startOf('hour'); // -> Wed Sep 30 2015 12:01:00
// -> Wed Sep 30 2015 12:00:00
Facile. Comme indiqué par beaucoup d'autres, utilisez simplement Moment.startOf :
var roundDown = moment('2015-02-17 12:59:59').startOf('hour');
roundDown.format('HH:mm:SS'); // 12:00:00
Surtout, cela fonctionne également comme prévu:
var roundDown = moment('2015-02-17 12:00:00').startOf('hour');
roundDown.format('HH:mm:SS'); // 12:00:00
Un peu plus compliqué, si nous voulons arrondir avec une bonne fonction plafond : par exemple, lorsque nous arrondissons par heure, nous voulons 12:00:00
pour arrondir à 12:00:00
.
var roundUp = moment('2015-02-17 12:00:00').add(1, 'hour').startOf('hour');
roundUp.format('HH:mm:SS'); // ERROR: 13:00:00
function roundUp(momentObj, roundBy){
if (momentObj.millisecond() != 1){
momentObj.subtract(1,'millisecond');
}
return momentObj.add(1, roundBy).startOf(roundBy);
}
var caseA = moment('2015-02-17 12:00:00');
roundUp(caseA, 'minute').format('HH:mm:SS'); // 12:00:00
var caseB = moment('2015-02-17 12:00:00.001');
roundUp(caseB, 'minute').format('HH:mm:SS'); // 12:01:00
var caseC = moment('2015-02-17 12:00:59');
roundUp(caseC, 'minute').format('HH:mm:SS'); // 12:01:00
Je cherchais cette même question et j'ai trouvé une meilleure solution: utilisez le troisième paramètre dans la fonction diff()
:
moment("2019-05-02 17:10:20").diff("2019-05-02 17:09:30","minutes",true)
En définissant le troisième paramètre sur true, vous obtenez la valeur brute comme réponse que vous pouvez arrondir par vous-même à l'aide de Math.round()
Voir JSFiddle: https://jsfiddle.net/2wqs4o0v/3/
Une réponse plus précise:
t.add(30, 'seconds').startOf('minute')
Cas 1: Arrondi si secondes <30
t = moment(); //12:00:05
t.add(30, 'seconds').startOf('minute') //12:00:00
Cas 2: arrondir si secondes> = 30
t = moment(); //12:00:33
t.add(30, 'seconds').startOf('minute') //12:01:00
Cette solution a fonctionné pour moi;
function round_up_to_nearest_hour(date = new Date()) {
return moment(date).add(59, 'minutes').startOf('hour').toDate();
}
Juste une autre possibilité:
var now = moment();
// -> Wed Sep 30 2015 11:57:20 GMT+0200 (CEST)
now.add(1, 'm').startOf('minute');
// -> Wed Sep 30 2015 11:58:00 GMT+0200 (CEST)