77 votes

arrondir à la minute supérieure/ inférieure un momentjs un moment à la minute la plus proche

Comment arrondir à la hausse/à la baisse un momentjs à la minute près ?

J'ai vérifié le documents 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 renvoyée (ou modifiée sur place, l'un ou l'autre convient). Je préfère ne pas avoir à convertir en chaîne de caractères, et à la reconvertir également.

Merci.


Comme demandé, voici un peu de 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 à la baisse, mais cela semble un peu hasardeux. Je cherche une façon plus élégante d'y parvenir.

118voto

Liyali Points 3551

Pour arrondir, il faut ajouter une minute et ensuite l'arrondir . Pour arrondir à l'unité inférieure, il suffit d'utiliser la fonction startOf método.

Notez l'utilisation d'un opérateur ternaire pour vérifier si le temps doit être arrondi ( par exemple, 13:00:00 sur le point n'a pas besoin d'être arrondi ).

Arrondir à la minute la plus proche

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

Arrondir à l'heure la plus proche

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

27voto

bguiz Points 6226

Réponse partielle :

Arrondir à la minute inférieure :

var m = moment();
m.startOf('minute');

Cependant, l'équivalent pour l'arrondi vers le haut, endOf ne donne pas tout à fait le résultat escompté.

24voto

martinedwards Points 601

L'arrondi à l'heure la plus proche peut être obtenu en ajoutant une demi-heure, puis en exécutant .startOf('hour'). Il en va de même pour toute mesure du 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

15voto

Tri Q Points 2661

En fonction roundTo pourrait faire l'objet d'une prochaine version.

Exemples :

moment().roundTo('minute', 15); // output: 12:45
moment().roundTo('minute', 15, 'down'); // output: 12:30

13voto

remeika Points 544

Arrondir à la baisse

Facile. Comme indiqué par de nombreux autres, il suffit d'utiliser Moment.startOf :

var roundDown = moment('2015-02-17 12:59:59').startOf('hour');
roundDown.format('HH:mm:SS'); // 12:00:00

Il est important de noter que 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

L'arrondi

Un peu plus délicat, si nous voulons arrondir avec un véritable fonction de plafond : par exemple, lorsque l'on arrondit à l'heure supérieure, on veut 12:00:00 pour arrondir à 12:00:00 .

Cela ne fonctionne pas

var roundUp = moment('2015-02-17 12:00:00').add(1, 'hour').startOf('hour');
roundUp.format('HH:mm:SS'); // ERROR: 13:00:00

Solution

function roundUp(momentObj, roundBy){
  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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X