【问题标题】:How to round a number to full minutes?如何将数字四舍五入到整分钟?
【发布时间】:2019-06-26 09:42:12
【问题描述】:

如何取整秒数:

1 sec - 59 sec1 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?

我使用库“时刻”


预期效果:

Date2 - date1 = 结果四舍五入到整分钟。

date2 - date1 = 30 s -> 舍入到 1 m

date2 - date1 = 5s -> 舍入到 1 m

date2 - date1 = 1m 10s -> 舍入到 2 m

在 javascript 或 moment.js 库中可能有方法

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

  return  Math.round(b) * 60; 
}

不同的 1m 20 s --> 舍入到 2m --> 没关系

不同的 5s --> 不要四舍五入到 1 m // problem here

【问题讨论】:

  • 为什么? 60 不是秒的有效值 - 至少在时间条目的情况下不是。
  • 也不知道你的“例子”是什么意思。
  • 0:0:1 不是表示 0 天 0 小时 1 分钟吗?
  • momentjs.com/docs/#/durations/seconds “将返回一个介于 0 和 59 之间的数字” - 所以无论如何,最后一部分的值都不会 > 60,如果你想要将所有到 60的数字四舍五入,你不妨在末尾附加静态文本文字 60
  • 对不起。我更新了我的答案。我想得到结果 0: 1: 0

标签: javascript momentjs


【解决方案1】:

您正在搜索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>

更新

到目前为止,Moment 不支持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>

或使用 moment-duration-format

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 m1h 12 m10h。快捷方式m, h
【解决方案2】:

您可以将秒数加上 59 秒,然后得到底分。

console.log([0, 1, 59, 60, 61].map(v =&gt; Math.floor((v + 59) / 60)));

【讨论】:

    【解决方案3】:

    Sjoerd Loeve 对this possible duplicate 的回答包括一个链接,指向一个干净的方法https://jsfiddle.net/2wqs4o0v/3

    var now = new moment(new Date());
    
    if (now.seconds() > 0) {
        now.add('minutes', 1);
    }
    

    JSFiddle 不导入 moment(SO 也不导入),但看起来它会起作用,如果你想用 0 秒但 > 0 毫秒四舍五入时间,可以添加 &amp;&amp; now.milliseconds() &gt; 0

    【讨论】:

      【解决方案4】:

      试试这个,它有点基本,但它会起作用:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-17
        • 1970-01-01
        • 2011-07-04
        • 2015-12-05
        • 2011-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多