两个日期的间隔

如果规定一个月30天(不按自然月的天数,规定一个月按30天算),求当前天,与2022年5月1号或者其他任意一个日期相差还有多少天

阅读 4.3k
6 个回答

计算2个日期之间相差多少天,摘至20 个杀手级 JavaScript 单行代码

const dayDif = (date1, date2) => Math.ceil(Math.abs(date1.getTime() - date2.getTime()) / 86400000)
    
dayDif(new Date("2020-10-21"), new Date("2021-10-22"))
// Result: 366

这不挺简单的么……

(年差 × 12 + 月差) × 30 + 日差,结果取绝对值。

let date1 = new Date('2021/11/02');
let date2 = new Date('2022/05/01');

let diffY = date2.getFullYear() - date1.getFullYear();
let diffM = date2.getMonth() - date1.getMonth();
let diffD = date2.getDate() - date1.getDate();

let result = Math.abs((diffY * 12 + diffM) * 30 + diffD); // 179,即隔 6 个月又少 1 天

P.S. 每个月都按 30 天算的话其实有个问题啊,你要是比 2021-05-302021-05-31,是咋算啊……

那就求中间月数。然后把前后的天数加上。
比如说 五月10号至六月20号。就是(30-10)+(30*0)+20 = 40

/**
 * 按每月30天,计算相距天数
 * @param arr1 [年,月,日]
 * @param arr2 [年,月,日]
 * @returns {number} = arr2 - arr1;
 */
let clacNum = (arr1 = [0, 0, 0], arr2 = [0, 0, 0]) => {
    let yearIdx = 0, monthIdx = 1, dayIdx = 2;
    let year = arr2[yearIdx] - arr1[yearIdx];
    let month = arr2[monthIdx] - arr1[monthIdx];
    let day = arr2[dayIdx] - arr1[dayIdx];
    return (year * 12 * 30) - (month * 30) - day;
};
clacNum([new Date().getFullYear(), new Date().getMonth() + 1, new Date().getDay()], [2022, 5, 1])
//541

楼主这个规定:

规定一个月30天(不按自然月的天数,规定一个月按30天算)

是否也同时规定了

  1. 当前天时间也应该符合这样的规定?
  2. 2022年某天的时间也该符合这样的规定?

否则就像前面一样,会出现很多问题,既有当前天地情况,也有2022年某天的情况,比如当前天是2021年12月31日,或者2022年某天是2022年3月31日?

我觉得这样还不如真实计算两个日期相隔的天数,这反而有系统或者一些成形的库已经处理好相应问题了。

算时间差跟“假设每个月 30 天”没有关系,不过一个月多少天,两个时间之间相关的天数是不会变的。
Date 类型的时间可以通过 getTime() 获得毫秒数,通过除法可以精确到天(从 1970 年 1 月 1 日)

Math.floor(d.getTime() / (24 * 60 * 60 * 1000))

两个时间的这个数据拿到之后直接相减就可以得到相关的天数。但是 ——

getTime() 是按 UTC 时间算的,而不是本地时间。由于时区偏移有可能会跨天,所以必须把这个偏移补上。中国时区是 +8 个小时,所以获取天数的代码应该修正为:

Math.floor((d.getTime() + 8 * 3600 * 1000) / (24 * 3600 * 1000))

相关的天数拿到了,如果想换算成多少年多少月多少日的显示方式,才会用到题主的那个假设,直接用整除和取模运算就可以拿到。

const [diff, format] = (() => {

    function getAbsoluteDays(d, offset = 28800000) {
        return Math.floor((d.getTime() + offset) / 86400000);
    }

    function getDiff(d1, d2) {
        return Math.abs(getAbsoluteDays(d1) - getAbsoluteDays(d2));
    }

    function formatDiff(totalDays) {
        const years = Math.floor(totalDays / 360);
        totalDays %= 360;
        const months = Math.floor(totalDays / 30);
        const days = totalDays % 30;
        return [years, "年", months, "月", days, "日"].join(" ");
    }

    return [getDiff, formatDiff];
})();


const d1 = new Date();
const d2 = new Date(2022, 4, 1);

console.log(d2, d1);
console.log("相差天数:", diff(d1, d2));
console.log("相关时间:", format(diff(d1, d2)));

测试输出

2022-04-30T16:00:00.000Z 2021-11-03T01:47:49.869Z
相差天数: 179
相关时间: 0 年 5 月 29 日
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏