i have below code
End date = 31 oct 2024 and
elapsedPercentage is 10% of total duration on current date
as per above params
expected Start date value is 12 aug 2023
but i am getting 07 Dec 2023 from below code
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;
}
}
Not sure why you are calculating with the lengthOfYear
. You should calculate the days between now and end date, which represent (100 - elapsedPercentage)%
. You can do that by using DAYS.between() method from java.time.temporal.ChronoUnit
. With that you can easily get the number of days to subtract from now to get the start date. Something like:
public static Timestamp calculateStartDate(double elapsedPercentage, Timestamp endDate) {
LocalDate end = endDate.toLocalDateTime().toLocalDate();
LocalDate now = LocalDate.now();
long daysBetween = DAYS.between(now, end);
long toSubtract = (long) (elapsedPercentage * daysBetween / (100 - elapsedPercentage));
LocalDate start = now.minusDays(toSubtract);
return Timestamp.valueOf(start.atStartOfDay());
}