【问题标题】:Affected days of time range with moment.jsmoment.js 影响时间范围的天数
【发布时间】:2019-10-31 10:13:06
【问题描述】:

我尝试遍历两个给定的日期时间。我必须对范围的每一天进行一些计算。我做了一个JsBin 来设置问题。

const timeRange1 = ['2019-10-22 14:00:00', '2019-10-22 19:00:00']; 
const timeRange2 = ['2019-10-22 13:30:00', '2019-10-24 10:00:00'];
const timeRange3 = ['2019-10-22 06:00:00', '2019-10-23 23:00:00'];
const timeRange4 = ['2019-10-21 23:00:00', '2019-10-22 01:00:00'];
    
function loop(range) {
  const rangeStart = moment(range[0])
  const rangeEnd = moment(range[1])
  let i = 0
  for (let m = rangeStart; m.diff(rangeEnd, 'days') <= 0; m.add(1, 'days')) {
    i++
  }
  return i
}
  
// Here you can see the expected values and the wrong results. 

console.log(loop(timeRange1)); // 1 - 2
console.log(loop(timeRange2)); // 3 - 3
console.log(loop(timeRange3)); // 2 - 3
console.log(loop(timeRange4)); // 2 - 2
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"&gt;&lt;/script&gt;

【问题讨论】:

  • const rangeStart = moment(range[0]) 在您修改 rangeStart 的循环中的语义不正确。除非您真的要将变量视为常量,否则使用 let 更有意义。

标签: javascript node.js momentjs


【解决方案1】:

这似乎来自时代。当范围结束的时间部分高于范围开始的时间部分时,添加一天不会使差异小于0。

如果你从你的时刻值中截断它们,结果就是你所期望的(使用.startOf('day')

function loop(range) {
  const rangeStart = moment(range[0]).startOf('day')
  const rangeEnd = moment(range[1]).startOf('day')
  let i = 0
  for (let m = rangeStart; m.diff(rangeEnd, 'days') <= 0; m.add(1, 'days')) {
    i++
  }
  return i
}

【讨论】:

    【解决方案2】:

    问题在于diff 被截断为整数,因此直到差至少 1 天,循环才会停止。考虑第一个例子:

    1. rangeStart 初始值:'2019-10-22 14:00:00'
    2. rangeEnd 值:'2019-10-22 19:00:00'

    第一次迭代:

    1. 差异:0.2 天,截断为 0,因此 i 递增 (1)
    2. rangeStart 增加到:'2019-10-23 14:00:00'

    第二次迭代:

    1. 差异为 -0.8 天,截断为 0,因此 i 再次递增 (2)
    2. rangeStart 增加到:'2019-10-24 14:00:00'

    第三次迭代

    1. 相差-1.8天,截断为-1,因此循环终止
    2. i 返回 (2)

    比较需要:

    1. 截断帐户
    2. 使用小数天数(使用第三个参数 true)
    3. 将日期设置为同一时间(例如 guillaume.deslandes 建议的 00:00:00)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多