web-dev-qa-db-fra.com

Moment rond.js temps d'objet à 30 minutes près

J'essayais d'arrondir l'objet temporel moment.js au prochain intervalle de 30 minutes le plus proche. Mais regarde ma logique nous a tort. Est ce que quelqu'un peut m'aider . Ex:

10:13am -> 10:30am
11:45am -> 12:00pm

Voici mon code actuel

start = moment();
minuteReminder = start.minute() % 30;
start.add(minuteReminder, 'minutes');
start.format("D YYYY, h:mm:ss a");
41
Achintha Samindika

const start = moment('2018-12-08 09:42');
const remainder = 30 - (start.minute() % 30);
 
const dateTime = moment(start).add(remainder, "minutes").format("DD.MM.YYYY, h:mm:ss a");

console.log(dateTime);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js"></script>

Des millions de façons de le faire. Vous n'avez pas besoin de moment.js vraiment. Quoi qu'il en soit, en voici un.

72
jtromans

Sur la base des réponses et commentaires de @Volune et @Cabloo, une version mise à jour peut ressembler à:

function round(date, duration, method) {
    return moment(Math[method]((+date) / (+duration)) * (+duration)); 
}

Ce qui peut alors être utilisé comme:

var date = moment();
var roundedDate = round(date, moment.duration(15, "minutes"), "ceil");
39
janhartmann

Une solution générique:

var ROUNDING = 30 * 60 * 1000; /*ms*/
start = moment();
start = moment(Math.ceil((+start) / ROUNDING) * ROUNDING);
start.format("D YYYY, h:mm:ss a");

Vous pouvez remplacer la variable ROUNDING de 30 minutes par celle que vous souhaitez et modifier Math.ceil par Math.round ou Math.floor si vous souhaitez utiliser une autre méthode pour arrondir la valeur.

28
Volune

Vous pouvez le faire par une simple clause if-else:

            if(moment().minute()> 30){
                var myTime = moment().minute(30).second(0);

            }else{
                var myTime = moment().minute(0).second(0);
            }
2
Aida Nowzari

même si la question a été résolue, j'aimerais partager ma solution aussi. 

var moment = require('moment');

const roundToNearestXXMinutes = (dateTime, roundTo) => {
    let remainder = roundTo - (start.minute()+ start.second()/60) % roundTo ;
    //console.log(moment(start).format("DD.MM.YYYY HH:mm:ss"));
    remainder = (remainder >  roundTo/2) ? remainder = -roundTo + remainder : remainder;
    const changedDate = moment(start).add(remainder, "minutes" ).seconds(0).format("DD.MM.YYYY HH:mm:ss");
    //console.log('is changed to');
    //console.log(changedDate);
}

roundToNearestXXMinutes(new Date("October 13, 2014 23:46:00"), 10);
0