如何在java中查找经过时间的开始日期和结束日期

How to find Start date from time elapsed as percentage and End date in java

提问人:Dandy 提问时间:9/27/2023 最后编辑:Dandy 更新时间:9/27/2023 访问量:84

问:

我有下面的代码

结束日期 = 2024 年 10 月 31 日,
已用百分比为当前日期总持续时间的 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-8 时间戳 localdate

评论

3赞 Basil Bourque 9/27/2023
顺便说一句,避免遗留类。几年前被现代的 java.time 类所取代,特别是 .java.sql.TimestampInstant
0赞 Reilas 9/27/2023
当前日期的 10%,所以 24 小时的 10%?24 ⨯ 0.1 = 2.4。或者你是说总持续时间的 10% 将发生在结束日期?

答:

1赞 halil 9/27/2023 #1

通过此修改,当您提供 10% 的已用百分比和结束日期“2024-10-31”时,代码应为您提供“2023-08-12”的预期开始日期。

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 {
        // Convert the Timestamp to LocalDateTime
        LocalDateTime endDateTime = endDate.toLocalDateTime();
        
        // Calculate the total duration in days (from end date to one year later)
        long totalDurationDays = ChronoUnit.DAYS.between(endDateTime.toLocalDate(), endDateTime.plusYears(1).toLocalDate());
        
        // Calculate the elapsed days based on the percentage
        long elapsedDays = (long) (totalDurationDays * (elapsedPercentage / 100.0));
        
        // Subtract the elapsed days from the end date
        LocalDate startDate = endDateTime.toLocalDate().minusDays(elapsedDays);
        
        // Create a Timestamp from the start date at midnight
        return Timestamp.valueOf(startDate.atTime(LocalTime.MIDNIGHT));
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}




评论

0赞 Dandy 9/27/2023
thnks 用于快速响应,这里 endDates.minus 给出编译时错误“LocalDate 类型中的方法 minus(TemporalAmount) 不适用于参数 (double)”
0赞 halil 9/27/2023
您遇到的错误是因为 LocalDate 的 minus 方法需要 TemporalAmount 作为其参数,而不是双精度值。若要通过减去小数天数来计算新的 LocalDate,可以将双精度转换为表示天数的长整型,然后将其用作 TemporalAmount。我更新了答案。
0赞 Anonymous 9/27/2023
这给了我 2024-09-25,而 OP 要求 2023-08-12。
0赞 halil 9/27/2023
我编辑了,请检查。@OleV.V.
0赞 Anonymous 9/27/2023
我仍然得到相同的结果。我不认为你的编辑有任何区别。我怀疑您可能没有正确理解这些要求。他们肯定没有在问题中明确描述,所以这也就不足为奇了。
3赞 Eritrean 9/27/2023 #2

不知道为什么要用 .您应该计算从现在到结束日期之间的天数,这表示 .您可以使用 java.time.temporal.ChronoUnit 中的 DAYS.between() 方法做到这一点。有了它,您可以轻松获得从现在减去的天数来获得开始日期。像这样:lengthOfYear(100 - elapsedPercentage)%

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());
}