如何从Java中经过的时间百分比和结束日期中查找开始日期

问题描述 投票:0回答:1

我有以下代码

结束日期 = 2024 年 10 月 31 日且
elapsedPercentage 是当前日期总持续时间的 10%

按照上述参数

预计开始日期值为 2023 年 8 月 12 日

但我从下面的代码中得到 2023 年 12 月 7 日

 public static Timestamp calculateStartDate(double elapsedPercentage, Timestamp endDate) {
    try {
        
        LocalDate endDates = endDate.toLocalDateTime().toLocalDate();
        long elapsedDays = (long) (endDates.lengthOfYear() *((100 - elapsedPercentage) / 100.0));
        LocalDate startDate = endDates.minusDays(elapsedDays);
        return  Timestamp.valueOf(startDate.atTime(LocalTime.MIDNIGHT));


    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}
java java-8 timestamp localdate
1个回答
0
投票

您的代码中计算 elapsedDays 的方式似乎存在问题。问题出在这一行:

long elapsedDays = (long) (endDates.lengthOfYear() *((100 - elapsedPercentage) / 100.0));

lengthOfYear() 方法返回一年中的天数,但您想要计算开始日期和结束日期之间的总天数。为此,您应该使用 java.time 包中的 ChronoUnit.DAYS. Between() 方法。以下是修复代码的方法:

import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;

public static Timestamp calculateStartDate(double elapsedPercentage, Timestamp endDate) {
    try {
        LocalDate endDates = endDate.toLocalDateTime().toLocalDate();
        LocalDate startDate = endDates.minus(ChronoUnit.DAYS.between(endDates, endDates.plusYears(1)) * elapsedPercentage / 100.0);
        return Timestamp.valueOf(startDate.atTime(LocalTime.MIDNIGHT));
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.