我有以下代码

End date = 31 oct 2024 and
elapsedPercentage is 10% of total duration on current date

根据上述参数

预期开始日期值为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;
    }
}

推荐答案

不知道你为什么要用lengthOfYear来计算.您应该计算从现在到结束日期之间的天数,即(100 - elapsedPercentage)%天.您可以使用java.time.temporal.ChronoUnit中的DAYS.between()方法来做到这一点.这样,您就可以很容易地获得从现在开始减go 的天数,从而得到开始日期.类似于:

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

Java相关问答推荐

将Nimbus设置为计算机上运行的所有Java应用程序的默认外观

gitlab ci不会运行我的脚本,因为它需要数据库连接'

@从类文件中删除JsonProperty—Java

参数值[...]与预期类型java.util.Date不匹配

缩小画布比例后更改滚动窗格的内部大小

springboot start loge change

如何使用AWS CLI从S3存储桶中的所有对象中删除用户定义的元数据?

所有 case 一起输入时输出错误,而单独放置时输出正确

编译多个.Java文件并运行一个依赖于用户参数的文件

在Spring Boot中使用哪个Java类来存储创建时间戳?

二进制数据的未知编码/序列化

当b是一个字节并且在Java中值为-1时,为什么b>;>;>;1总是等于-1?

一对多关系和ID生成

如何在盒子的顶部和底部创建两张不同图片(大小相同)的盒子?

Win32函数的JNA绑定DwmGetColorizationColor返回E_INVALIDARG错误

协同 routine 似乎并不比JVM线程占用更少的资源

如何设置默认序列生成器分配大小

spring 数据Elastic search 与 spring 启动数据Elastic search 之间的区别是什么?

如何在更改分辨率时将鼠标坐标计算为世界坐标

找不到 jar 文件系统提供程序try 使用 jdeps 和 jlink 创建收缩 Java 映像来运行 Minecraft