如何用date-fns计算入住日期分属两个季节的天数
分季节计算入住天数(基于date-fns实现)
直接用date-fns的eachDayOfInterval遍历入住期间的每一天,结合月份判断归属季节,就能统计出两个季节的天数,具体实现如下:
核心思路
- 用
eachDayOfInterval生成入住日到退房日的所有日期数组 - 定义季节判断规则:date-fns的月份是0基(0=1月,4=5月,8=9月,9=10月,3=4月),因此5-9月对应
月份>=4且<=8,其余为10月至次年4月的季节 - 遍历日期数组,分别统计两个季节的天数
代码实现
import { eachDayOfInterval, getMonth, subDays } from 'date-fns'; // 判断日期是否属于5-9月的季节 const isInWarmSeason = (date) => { const month = getMonth(date); return month >= 4 && month <= 8; }; // 计算分季节入住天数 // 注:默认包含退房日,若要排除退房日,将end改为subDays(checkOut, 1) const calculateSeasonStayDays = (checkIn, checkOut) => { const stayDays = eachDayOfInterval({ start: checkIn, end: checkOut }); let warmSeasonDays = 0; let coolSeasonDays = 0; stayDays.forEach(day => { isInWarmSeason(day) ? warmSeasonDays++ : coolSeasonDays++; }); return { warmSeasonDays, coolSeasonDays }; }; // 使用示例 const checkInDate = new Date('2024-09-28'); const checkOutDate = new Date('2024-10-05'); const seasonDays = calculateSeasonStayDays(checkInDate, checkOutDate); console.log(`5-9月季节天数:${seasonDays.warmSeasonDays},10-次年4月季节天数:${seasonDays.coolSeasonDays}`); // 输出:5-9月季节天数:3,10-次年4月季节天数:5
补充说明
- 跨年度场景自动兼容:比如入住日为2024年12月,退房日为2025年3月,所有日期都会被正确归类到10-次年4月的季节
- 若业务逻辑中退房当天不算入住天数,只需修改
eachDayOfInterval的end参数为subDays(checkOut, 1)即可
内容的提问来源于stack exchange,提问作者CIB
相关产品推荐
相关产品推荐

