Как округлить число до полных минут? - PullRequest
0 голосов
/ 26 июня 2019

Как округлить секунды:

между 1 sec - 59 sec до 1 minute

между 1 min 1 sec - 1 min 59 sec -> округлить до 2 m

между 1h 2 min 1 sec - 2 min 59 sec -> округление до 1h 3 m?

между 2 min 1 sec - 2 min 59 sec -> округление до 3 m?

Я использую библиотеку 'момент '


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

Дата2 - дата1 = Результат округляется до полных минут.

дата2 - дата1 = 30 с -> округление до 1 м

дата2 - дата1 = 5 с -> округление до 1 м

дата2 - дата1 = 1 м 10 с -> округление до 2 м

Может быть путь в javascript или вmoment.js библиотека

a = (d1, d2) => {
  let b= moment(d2).diff(d1,"minutes",true)

  return  Math.round(b) * 60; 
}

разные 1м 20 с -> округлить до 2м -> все нормально

разные 5с -> не округлять до 1 м // problem here

Ответы [ 4 ]

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

Вы ищете Math.ceil()

const a = (d1, d2) => {
  let b = moment(d2).diff(d1, "minutes", true)
  return Math.ceil(b)
}

console.log(a('2019-07-05 10:43:18', '2019-07-05 10:43:18'))
console.log(a('2019-07-05 10:43:18', '2019-07-05 10:43:59'))
console.log(a('2019-07-05 10:43:18', '2019-07-05 10:44:59'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js" integrity="sha256-H9jAz//QLkDOy/nzE9G4aYijQtkLt9FvGmdUTwBk6gs=" crossorigin="anonymous"></script>

ОБНОВЛЕНИЕ

Момент не поддерживает duration().format() до сих пор.Но вы можете попробовать этот обходной путь (вам нужно обрабатывать дни, если требуется)

const a = (d1, d2) => {
  let b = moment(d2).diff(d1, "minutes", true)
  let d = moment.duration({
    minutes: Math.ceil(b)
  })
  return moment(d._data).format('H[h] m[m]').replace(/^0h\s|\s0m/, '')
}

console.log(a('2019-07-05 10:43:18', '2019-07-05 10:43:18'))
console.log(a('2019-07-05 10:43:18', '2019-07-05 10:43:59'))
console.log(a('2019-07-05 10:43:18', '2019-07-05 20:44:59'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js" integrity="sha256-H9jAz//QLkDOy/nzE9G4aYijQtkLt9FvGmdUTwBk6gs=" crossorigin="anonymous"></script>

ИЛИ с использованием в формате момент-продолжительность

const a = (d1, d2) => {
  let b = moment(d2).diff(d1, "minutes", true)
  
  return moment.duration({
    minutes: Math.ceil(b)
  }).format("d[d] h[h] m[m]", { trim: "both" });
}

console.log(a('2019-07-05 10:43:18', '2019-07-05 10:43:18'))
console.log(a('2019-07-05 10:43:18', '2019-07-05 10:43:59'))
console.log(a('2019-07-05 10:43:18', '2019-07-07 20:44:59'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js" integrity="sha256-H9jAz//QLkDOy/nzE9G4aYijQtkLt9FvGmdUTwBk6gs=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-duration-format/2.3.2/moment-duration-format.min.js" integrity="sha256-M2KULKSJyw+G0068JiMlM9GX4XpLdUButSzBqntKDZM=" crossorigin="anonymous"></script>
1 голос
/ 04 июля 2019

Попробуйте, это немного базово, но будет работать:

const MAX_MIN_SEC = 60;
const MAX_HRS = 24;
const MAX_DAYS = 365;
var date1 = new Date(2018, 07, 00, 00, 00, 00);
var date2 = new Date(2018, 07, 00, 00, 00, 05);
var msec = date2 - date1;
var seconds = Math.floor(msec / 1000);
var mins = Math.floor(seconds / MAX_MIN_SEC);
var hrs = Math.floor(mins / MAX_MIN_SEC);
var days = Math.floor(hrs / MAX_HRS);
var yrs = Math.floor(days / MAX_DAYS);
seconds = seconds % MAX_MIN_SEC;
mins = mins % MAX_MIN_SEC; 
hrs = hrs % MAX_HRS;
days = days % MAX_DAYS;
if (seconds > 0){
  seconds = 0;
  mins++;
}
if (mins >= MAX_MIN_SEC){
  mins = 0;
  hrs++;
}
if (hrs >= MAX_HRS){
  hrs = 0;
  days++;
}
if (days >= MAX_DAYS){
  days = 0;
  yrs++;
}
Console.log(yrs + " year/s, " + days + " day/s, " + hrs + " hour/s, " + mins + " minute/s," + seconds + " second/s");

Результат:

0 years, 0 days, 0 hours, 1 minutes,0 seconds
1 голос
/ 27 июня 2019

Вы можете добавить 59 секунд к секундам и получить потерянные минуты.

console.log([0, 1, 59, 60, 61].map(v => Math.floor((v + 59) / 60)));
0 голосов
/ 03 июля 2019

Sjoerd Loeve ответ на этот возможный дубликат включает ссылку на чистый способ сделать это https://jsfiddle.net/2wqs4o0v/3:

var now = new moment(new Date());

if (now.seconds() > 0) {
    now.add('minutes', 1);
}

JSFiddle не импортирует момент (как и SO), но похоже, что он будет работать, и вы можете добавить && now.milliseconds() > 0, если хотите округлить время за 0 секунд, но> 0 миллисекунд.

...