【问题标题】:How to return the number of weekdays from two dates in java [duplicate]如何从java中的两个日期返回工作日数[重复]
【发布时间】:2020-07-31 10:19:46
【问题描述】:

我有两个日期示例:开始日期 = 2020 年 3 月 19 日星期五,结束日期 = 2020 年 3 月 21 日星期二。如果我返回日历天数,则为4。如何编写仅返回上述开始和结束日期的工作日的方法?

谢谢!

【问题讨论】:

  • 你试过这里提到的答案stackoverflow.com/questions/20165564/…
  • 分享您的研究对每个人都有帮助。告诉我们您尝试了什么以及为什么它不能满足您的需求。这表明您已经花时间尝试帮助自己,它使我们免于重复明显的答案,最重要的是它可以帮助您获得更具体和相关的答案!另见How to Ask
  • 您的示例日期没有意义。 2020 年 3 月 19 日是星期四,2020 年 3 月 21 日是星期六。这些日期仅相隔 2 天。我猜你的意思是 2020 年 3 月 20 日到 2020 年 3 月 24 日?
  • 这能回答你的问题吗? Calculate number of weekdays between two dates in Java。不是所有的答案都有好的答案。首先选择使用 java.time(现代 Java 日期和时间 API)的那些。

标签: java localdate


【解决方案1】:

这是一种可能性,可能还有其他更简洁的可能性。

使用以下日期作为起点和终点。

        LocalDate start = LocalDate.of(2020, 1, 1);
        LocalDate end = LocalDate.of(2020,4,18);

现在定义 Predicate 以忽略周六和周日。这将应用于下面生成的日期流。

        Predicate<LocalDate> onlyWeekDays = ld -> !ld.getDayOfWeek()
                .equals(DayOfWeek.SATURDAY) 
                && !ld.getDayOfWeek().equals(DayOfWeek.SUNDAY);

现在使用datesUntil 方法在起点和终点之间生成日期流。

  • 结束日期增加 1 天,以使流包含结束日期。
  • 上述过滤器用于过滤周末。
  • 剩下的日期只是简单计算。
        long days = start.datesUntil(end.plusDays(1)).filter(onlyWeekDays::test).count();

        System.out.println(days);

使用的所有与日期相关的方法都来自 Java API 中的 java.time 包。

注意:作为 cmets 中提到的替代方法,DayofWeek 枚举的 EnumSet 也可以用作过滤器。它将按如下方式使用:

        Set<DayOfWeek> wkends = 
             EnumSet.of( DayOfWeek.SATURDAY,DayOfWeek.SUNDAY );

        long days = 
                start
                .datesUntil( end.plusDays(1) )
                .filter( ld -> !wkends.contains( ld.getDayOfWeek() ) )
                .count()
        ;

【讨论】:

  • 很好。我认为它尽可能简洁。也解释的很好,谢谢。
  • 非常好。一个想法:您可以使用EnumSet::contains 作为谓词。
  • @BasilBourque 好建议!我花了几分钟才弄清楚它是如何工作的。检查答案的结尾。
猜你喜欢
  • 1970-01-01
  • 2020-01-12
  • 2012-10-07
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多