You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 08:00:02