如果规定一个月30天(不按自然月的天数,规定一个月按30天算),求当前天,与2022年5月1号或者其他任意一个日期相差还有多少天
这不挺简单的么……
(年差 × 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-30
和 2021-05-31
,是咋算啊……
/**
* 按每月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天算)
是否也同时规定了
否则就像前面一样,会出现很多问题,既有当前天地情况,也有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 日
8 回答4.8k 阅读✓ 已解决
6 回答3.5k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
5 回答6.4k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
计算2个日期之间相差多少天,摘至20 个杀手级 JavaScript 单行代码