我有以下代码
结束日期 = 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;
}
}
您的代码中计算 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;
}
}