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.

10voto

viv Points 107

Une réponse plus précise :

t.add(30, 'seconds').startOf('minute')

Cas1 : Arrondir à la baisse si secondes < 30

t = moment(); //12:00:05
t.add(30, 'seconds').startOf('minute') //12:00:00

Cas2 : Arrondir à l'unité supérieure si secondes >= 30

t = moment(); //12:00:33
t.add(30, 'seconds').startOf('minute') //12:01:00

4voto

Sjoerd Loeve Points 221

Je cherchais la même question et j'ai trouvé une meilleure solution : Utiliser le troisième paramètre dans diff() fonction :

moment("2019-05-02 17:10:20").diff("2019-05-02 17:09:30","minutes",true)

En fixant le troisième paramètre à true, vous obtenez la valeur brute en tant que réponse que vous pouvez arrondir vous-même en utilisant Math.round()

Voir JSFiddle : https://jsfiddle.net/2wqs4o0v/3/

1voto

manutero Points 45

Une autre possibilité :

const 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)

1voto

Mokky Miah Points 327

Cette solution a fonctionné pour moi ;

function round_up_to_nearest_hour(date = new Date()) {
   return moment(date).add(59, 'minutes').startOf('hour').toDate();
}

0voto

Finesse Points 2058

La solution la plus simple à ce jour :

function floor(time, floorBy = 'minute') {
  return time.startOf(floorBy);
}

function ceil(time, ceilBy = 'minute') {
  return time.subtract(1, 'millisecond').add(1, ceilBy).startOf(ceilBy);
}

// The solution is above. The code below is an optional test:

console.log(
  floor(moment('2019-01-01 12:00:00.000')).format('H:mm:ss.SSS') === '12:00:00.000',
   ceil(moment('2019-01-01 12:00:00.000')).format('H:mm:ss.SSS') === '12:00:00.000',
  floor(moment('2019-01-01 12:00:00.001')).format('H:mm:ss.SSS') === '12:00:00.000',
   ceil(moment('2019-01-01 12:00:00.001')).format('H:mm:ss.SSS') === '12:01:00.000',
  floor(moment('2019-01-01 12:15:16.876'), 'hour'  ).format('H:mm:ss.SSS') === '12:00:00.000',
   ceil(moment('2019-01-01 12:15:16.876'), 'hour'  ).format('H:mm:ss.SSS') === '13:00:00.000',
  floor(moment('2019-01-01 12:59:59.999'), 'second').format('H:mm:ss.SSS') === '12:59:59.000',
   ceil(moment('2019-01-01 12:59:59.999'), 'second').format('H:mm:ss.SSS') === '13:00:00.000',
  floor(moment('2019-01-01 12:00:00.025'), 'ms'    ).format('H:mm:ss.SSS') === '12:00:00.025',
   ceil(moment('2019-01-01 12:00:00.025'), 'ms'    ).format('H:mm:ss.SSS') === '12:00:00.025'
);

<script src="//cdn.jsdelivr.net/npm/moment@2.24.0/min/moment.min.js"></script>

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