提问人:Dandy 提问时间:9/27/2023 最后编辑:Dandy 更新时间:9/27/2023 访问量:84
如何在java中查找经过时间的开始日期和结束日期
How to find Start date from time elapsed as percentage and End date in java
问:
我有下面的代码
结束日期 = 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;
}
}
答:
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());
}
评论
java.sql.Timestamp
Instant