Разница между датами, округленный результат до ближайшей минуты - PullRequest
1 голос
/ 30 июня 2019

Разница между датами хочет округлить до ближайшей минуты. Округление date1, date2 вниз или вверх. Возвращенный результат уже округлен до полной минуты. Я могу изменить date1, date2. Не изменяйте уже возвращенный результат

date2- date1

Код здесь: https://stackblitz.com/edit/react-azau4g

Пример:

Первый шаг

this.state = {
  date1: "2019-06-29 21:25:38+00",
  date2: "2019-06-29T21:25:40.000+00:00"
}

round = (item) => {
  var m = moment(item);

  var roundUp = (m.second() || m.millisecond() ? m.add(1, 'minute').startOf('minute') : m.startOf('minute')).toISOString();
  return roundUp;
}

differentTime = {
    date1: this.state.date1.toISOString(),  
    date2: this.round(this.state.date2)   //return "2019-06-29T21:26:00.000+00:00"
}

Второй шаг

Ожидаемый эффект:

data2 - data1 = 1 мин


Пример 2

 this.state = {
      date1: "2019-06-29 21:25:01+00",
      date2: "2019-06-29T21:27:20.000+00:00"
    }



 differentTime2 = {
        date1: this.state.date1.toISOString(), 
        date2: this.round(this.state.date2)   //return "2019-06-29T21:28:00.000+00:00"
    }

Ожидаемый эффект:

date2 - date1 = 3 мин

Ответы [ 3 ]

1 голос
/ 02 июля 2019

Похоже, вам нужна функция, которая вычитает одну дату из другой и округляет разницу до ближайшей минуты.

Это невозможно сделать с помощью одного аргумента, например, функции round в вашем вопросе; вам нужна функция, которая принимает обе даты в качестве аргументов.

Я не слишком знаком с моментом, но вот функция, которая должна работать для встроенных дат.

РЕДАКТИРОВАТЬ: согласно комментариям OP, я обновил функцию, чтобы изменить d2 вместо возвращения diff.

    MS_IN_MINUTES = 60000;

    roundAway = (d1, d2) => {
      let diff = d2 - d1 // Difference in milliseconds (+ or -)
      let positive = diff > 0 // Whether we should add later
      diff = Math.abs(diff) // Difference in milliseconds (+)
      diff = diff / MS_IN_MINUTES // Difference in minutes (not rounded)
      diff = Math.ceil(diff) // Difference in minutes (rounded up)
      let roundedAway = d1.getTime()
      if (positive) {
          roundedAway += diff * MS_IN_MINUTES
      }
      else {
          roundedAway -= diff * MS_IN_MINUTES
      }
      d2.setTime(roundedAway)
    }
    
    let date1 = new Date("2019-06-29 21:25:38+00");
    console.log('date1:', date1)

    let date2 = new Date("2019-06-29T21:25:40.000+00:00");
    console.log('date2:', date2)

    let date3 = new Date("2019-06-29T21:24:36.000+00:00");
    console.log('date3:', date3)

    console.log('Unchanged date1:', date1);

    roundAway(date1, date2);
    console.log('Rounded date2:', date2);

    roundAway(date1, date3);
    console.log('Rounded date3:', date3);

Надеюсь, это поможет!

0 голосов
/ 02 июля 2019

Мы можем использовать метод diff, чтобы получить количество миллисекунд, преобразовать его в минуты и затем получить результат

import moment from 'moment';

let date1 = moment("2019-06-29 21:25:38+00");
console.log(date1)

let date2 = moment("2019-06-29T21:25:40.000+00:00");
console.log(date2)

// get the difference between the moments
const diff = date2.diff(date1);
console.log(diff);

// convert to minutes and ceil
const diffInMinutes = Math.ceil(diff/60000);
console.log(diffInMinutes);
0 голосов
/ 30 июня 2019

Это может помочь вам округлить дату до ближайшей минуты:

const date = moment("2019-06-29T21:59:59.000+00:00");
const seconds = date.seconds();
date.add(seconds > 0 && 60 - seconds, 's');
...