javascript - 如何计算日期以不允许日期小于当天?
问题描述
我正在制定一个业务规则,其中客户的签到永远不能少于前一天。但我只是发现天之间的差异,在这种情况下,以后几天和前几天的值是相同的,例如:
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 天
解决方案
您的问题是使用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
推荐阅读
- python - 如何将python变量放入SQL语句?
- javascript - CSS 位置:sticky 在向上滚动和向下滚动时表现不同
- java - 如何使用 DateTimeFormatter 解析“Feb 25”和“February 25”?
- c++ - 如果模板参数很复杂,则在模板函数中应用 std::conj
- reactjs - 反应材料容器页眉主要和页脚它未使用页眉中的 flexbox 对齐
- javascript - SVG 成功消息动画
- django - 测试中 Django 3.0 与 3.1 中的 MEDIA URL 不一致
- javascript - 使用函数获取数据 - JavaScript 中的 sqlite3
- sql-server - 键集分页 - 按多列搜索词过滤
- java - 为什么 DatagramSocket 在某些电脑中不发送