首页 > 解决方案 > 在给定持续时间时计算特定月份的天数

问题描述

给出了一个持续时间。例如:1 月 15 日至 3 月 15 日

我想在给定的持续时间内计算属于每个月的天数。在此示例中,该持续时间中 1 月的天数;在此期间,2 月的 15 天;在此期间,3 月的 28 天数;15

我正在寻找一个解决方案,它遍历持续时间的每个日期并检查是否Date.getMonth() = "Month I want to check against"

使用 Java Date 或 Java SQL Date 中的方法或使用任何其他 Date 类型是否有更简单的方法?

标签: javadatejava.util.date

解决方案


Map < YearMonth , Long >使用 lambda 语法

这是一个使用流和 lambda 的简洁代码的解决方案。尽管此解决方案确实遍历了时间范围的每个日期,但代码的简单性和清晰性可能超过了这种低效率。

用于LocalDate开始和结束日期。用于YearMonth跟踪每个月。

LocalDate start = LocalDate.of( 2019 , 1 , 15 );
LocalDate stop = LocalDate.of( 2019 , 3 , 16 );

制作一个Map以保留每个月的天数。

Map < YearMonth, Long > map =
        start
                .datesUntil( stop )
                .collect(
                        Collectors.groupingBy(
                                ( LocalDate localDate ) -> YearMonth.from( localDate ) ,
                                TreeMap::new ,
                                Collectors.counting()
                        )
                );

转储到控制台。

{2019-01=17, 2019-02=28, 2019-03=15}

System.out.println( map );
  1. 给定一个开始日期,LocalDate::datesUntil提供一个Stream对象LocalDate,递增days.

  2. 然后只需将 a 分组为SortedMap(a TreeMap) 以按时间顺序保持月份,按 分类YearMonth并计算该月份在该范围内的天数。

如果你想要总天数,你可以做

long totalDays = d.datesUntil(LocalDate.of(2019, 3, 16)).count();

推荐阅读