web-dev-qa-db-fra.com

arrondir vers le haut / arrondir un instant à la minute près

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.

50
bguiz

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

Arrondir à la minute près

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
77
Liyali

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.

21
bguiz

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
12
Tri Q Tran

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
12
martinedwards

Arrondir

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

Arrondir

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.

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){
  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
8
remeika

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/

4
Sjoerd Loeve

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
4
Vivek RC

Cette solution a fonctionné pour moi;

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

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)
0
Manu