【问题标题】:Check if date is older than x days (business days only) [duplicate]检查日期是否早于 x 天(仅限工作日)[重复]
【发布时间】:2023-03-16 02:59:02
【问题描述】:
public class App {

    public static void main(String[] args) {
        final String cobDate = "2021-04-08";
        final String recordDate = "2020-12-01";
    }

    public static ZonedDateTime getDate(String date, DateTimeFormatter formatter) {
        LocalDate localDate = LocalDate.parse(date, formatter);
        return localDate.atStartOfDay(ZoneId.of(ZoneOffset.UTC.getId()));
    }
}

我正在使用 java 8,我想检查 recordDate 的年龄是否大于 5 天。但不是从今天开始,而是比 cobDate 早 5 天?我该如何实现这一点,也许可以通过使用现有的返回ZoneDateTime 的实用程序方法来实现?它应该排除周末(例如周六和周日),并且只考虑工作日。

一些场景:

cob日期:08/04/2021 记录日期:08/04/2021 ==> false >> 不超过 5 天

cob日期:08/04/2021 记录日期:2021 年 3 月 31 日 ==> 正确>> 超过 5 天

cob日期:08/04/2021 记录日期:2021 年 2 月 4 日 ==> 错误 >> 不超过 5 天

【问题讨论】:

  • "只考虑工作日" - 是否也需要排除节假日?如果没有,使用 java.time api 计算两个日期之间的天数并减去星期六和星期日的数量应该是相当直接的
  • @Thomas 为简单起见,目前仅限周末。
  • 我已经为您可能想要查看的“重复”问题添加了答案。无需迭代,但如果您只对“是否超过 5 天”感兴趣,您可以简单地从 cobDate 开始向后迭代并计算工作日,直到您达到 > 5 或 recordDate 的值。如果记录日期是过去几年,则无需迭代即可知道从那时起已经过了 100 或 1000 天(即使您需要知道无需迭代)。

标签: java date java-8 localdate zoneddatetime


【解决方案1】:
private static long countBusinessDaysBetween(LocalDate startDate, LocalDate endDate) 
    {
        if (startDate == null || endDate == null) {
            throw new IllegalArgumentException("Invalid method argument(s) to countBusinessDaysBetween(" + startDate
                    + "," + endDate);
        }

        if (startDate.isAfter(endDate)) {
           throw new IllegalArgumentException("Start Date must be before End Date");
        }
 
        Predicate<LocalDate> isWeekend = date -> date.getDayOfWeek() == DayOfWeek.SATURDAY
                || date.getDayOfWeek() == DayOfWeek.SUNDAY;
 
        long daysBetween = ChronoUnit.DAYS.between(startDate, endDate);
 
        long businessDays = Stream.iterate(startDate, date -> date.plusDays(1)).limit(daysBetween)
                .filter(isWeekend.negate()).count();
        return businessDays;
    }

来自我刚刚删除了假期检查并添加了endDate 必须始终位于startDate 之后的约束。

calculate business days

那你就可以了

public boolean isOlderThanXDays(int xDays, LocalDate startDate, LocalDate endDate) {
      return (YourClassName.countBusinessDaysBetween(startDate, endDate) > xDays)
  }

【讨论】:

  • 在这种情况下 startDate 是 cobDate?并且 endDate 是我要检查的 recordDate 是否大于 cobDate 5 天?
  • 这里没有完全理解约束。我们想要在 endDate (recordDate) 之后的 cobdate (startDate)
  • 您需要致电isOlderThanXDays(5, recordDate, cobDate)
  • 那么应该是if (startDate.isBefore(endDate)) { ?
  • @M06H 我只是在 startDate 在 endDate 之后抛出异常。只是为了确保将使用startDate 调用该方法,该endDate 之前的@
猜你喜欢
  • 2018-04-05
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
  • 2012-01-29
  • 1970-01-01
  • 2023-01-23
  • 1970-01-01
相关资源
最近更新 更多