java - 在给定持续时间时计算特定月份的天数
问题描述
给出了一个持续时间。例如:1 月 15 日至 3 月 15 日
我想在给定的持续时间内计算属于每个月的天数。在此示例中,该持续时间中 1 月的天数;在此期间,2 月的 15 天;在此期间,3 月的 28 天数;15
我正在寻找一个解决方案,它遍历持续时间的每个日期并检查是否Date.getMonth() = "Month I want to check against"
使用 Java Date 或 Java SQL Date 中的方法或使用任何其他 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 );
给定一个开始日期,
LocalDate::datesUntil
提供一个Stream
对象LocalDate
,递增days
.然后只需将 a 分组为
SortedMap
(aTreeMap
) 以按时间顺序保持月份,按 分类YearMonth
并计算该月份在该范围内的天数。
如果你想要总天数,你可以做
long totalDays = d.datesUntil(LocalDate.of(2019, 3, 16)).count();
推荐阅读
- jenkins - Jenkins - 节流构建以在每个可用节点上运行一个作业
- docker - 如何通过 Helm 在 Kubernetes CI/CD 中使用 Azure Devops 发布管道变量?
- highcharts - Highmaps 不会显示我的 GeoJSON 湖层
- kubernetes - Kubernetes。我可以从其他 POD 执行 POD 中的任务吗?
- redis - Phantom Key - Spring Data Redis - 目标/最佳实践
- java - 如何在使用 Makefile 运行程序时添加命令行参数?
- phpstorm - 如何在不禁用检查的情况下删除此 PhpStorm 检查弹出窗口?
- php - 如何让表 1 中的所有人而不在表 2 中获得以我为 parent_id 的人?
- reactjs - 在加载 firebase 用户之前 React Private Route 重定向
- python - _AsyncBaseTransport._consume() 上的 RabbitMq Pika ConnectionResetError