首页 > 解决方案 > 如何计算日期以不允许日期小于当天?

问题描述

我正在制定一个业务规则,其中客户的签到永远不能少于前一天。但我只是发现天之间的差异,在这种情况下,以后几天和前几天的值是相同的,例如:

Current day: 11/02/2021
Checkin: 10/02/2021
Result: 1 day

Current day: 11/02/2021
Checkin: 02/12/2021
Result: 1 day

function calcularData(dataAtual, checkIn) {
  
  const dataatual = new Date(inverterData(dataAtual));
  const checkin = new Date(inverterData(checkIn));
  const timeDiff = Math.abs(checkin.getTime() - dataatual.getTime());
  const diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24));
  return diffDays
}
  
function inverterData(date) {
  const regex = '^([0-9]{2})([0-9]{2})([0-9]{4})';
  const dataFormatada = date.match(regex);

  return `${dataFormatada[2]}/${dataFormatada[1]}/${dataFormatada[3]}`;
}

console.log(calcularData('11022021','10012021'))

签到:2021 年 2 月 12 日结果:1 天

标签: javascriptdate

解决方案


您的问题是使用Math.abs来计算天数差异,因此负值变为正值。

当获取与整个日期的天数差异时,应使用Math.round以便过滤掉由夏令时更改引起的微小差异。ceil将修复一天少于 24 小时但不会更长的情况。圆形修复两者。

此外,您的解析方法可能会非常有效。从时间戳中获取值并将它们直接传递给 Date 构造函数比创建另一个字符串然后由内部解析器解析要好得多,例如

// Return difference in days
function calcularData(s1, s2) {
  // Parse timestamp in ddmmyyyy format to Date
  let parse = s => new Date(s.substr(4,4), s.substr(2,2) - 1, s.substr(0,2));
  return Math.round((parse(s2) - parse(s1)) / 8.64e7);
}

console.log(calcularData('11022021','10012021')) // -32

console.log(calcularData('11022021','10022021')) // -1

console.log(calcularData('11022021','12022021')) //  1


推荐阅读