基于Java Time计算两个日期间十进制月份差值的实现方案
基于Java Time实现十进制月份差值计算方案
核心计算逻辑
采用按实际月份天数加权的计算规则,保证跨不同天数月份的计算准确性:
- 先计算两个日期的整月差值部分
- 不足整月的部分按所在月的实际总天数折算占比
- 支持跨年月、任意日期的计算需求
代码实现
import java.time.LocalDate; import java.time.temporal.ChronoUnit; public class DecimalMonthDiffCalculator { public static double calculate(LocalDate startDate, LocalDate endDate) { // 日期倒序时返回负数 if (startDate.isAfter(endDate)) { return -calculate(endDate, startDate); } long fullMonthGap = ChronoUnit.MONTHS.between(startDate.withDayOfMonth(1), endDate.withDayOfMonth(1)); double startMonthRemainRatio = (startDate.lengthOfMonth() - startDate.getDayOfMonth() + 1) * 1.0 / startDate.lengthOfMonth(); double endMonthUsedRatio = endDate.getDayOfMonth() * 1.0 / endDate.lengthOfMonth(); if (fullMonthGap == 0) { // 同月场景直接计算间隔占比 return (endDate.getDayOfMonth() - startDate.getDayOfMonth() + 1) * 1.0 / startDate.lengthOfMonth(); } else { // 跨月场景:整月差减1 + 起始月剩余占比 + 结束月使用占比 return (fullMonthGap - 1) + startMonthRemainRatio + endMonthUsedRatio; } } public static void main(String[] args) { // 测试用例1:2021-08-01 到 2021-08-16 System.out.println(calculate(LocalDate.of(2021,8,1), LocalDate.of(2021,8,16))); // 输出约0.516,如需匹配示例的0.5近似值,可将除数改为固定30即可 // 测试用例2:2021-07-12 到 2021-08-05 System.out.println(calculate(LocalDate.of(2021,7,12), LocalDate.of(2021,8,5))); // 输出约0.806 } }
配置调整说明
- 统计口径调整:如果不需要包含起始/结束当天,删除对应计算公式中的
+1即可 - 精度调整:如果需要固定按每月30天折算,将所有
lengthOfMonth()替换为固定值30即可匹配示例输出的0.5结果
内容的提问来源于stack exchange,提问作者user3025404
相关产品推荐
相关产品推荐

