前言
有时候我们得到一段时间,需要将时间按照月份将这一段时间来分段。比如开始时间为 2020/07/15 至 2021/07/05 按照月份来将数据分组展示,所以需要将这端时间分为以下几段:
2020/07/15 ~ 2020/08/01
2020/08/01 ~ 2020/09/01
2020/09/01 ~ 2020/10/01
...
2021/06/01 ~ 2021/07/01
2021/07/01 ~ 2021/07/05
一、知识点
将时间分类主要是用到了Java中的 Calendar,像一般需要对时间进行处理的时候都是需要用到这个类的。可以使用 Calendar 这个类设置或获取日历中的时间,一些常用的API如下所示:
初始化Calendar对象
1
|
Calendar calendar = Calendar.getInstance(); |
设置日历的时间
1
2
|
Date time = new Date; calendar.setTime(time); |
获取日历中的时间(年月日)
1
2
3
|
calendar.set(Calendar.YEAR, 2021 ); // 年 calendar.add(Calendar.MONTH, 1 ); // 月 calendar.set(Calendar.DAY_OF_MONTH, 1 ); // 日 |
二、思路分析
大概的实现思路就是:从开始时间开始,以累加的方式逐月增加,直到当前时间大于结束时间则停止叠加。
要注意的是,即使当前时间大于结束时间也需要把结束时间添加到结果集中。因为最后一个时间段是从月初到结束日期的。
三、实现方案
实现的方式就和思路中是一样的,一些注释都写在代码中了,如下图所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
/** * 按照月份分割一段时间 * * @param startTime 开始时间戳(毫秒) * @param endTime 结束时间戳(毫秒) */ public static List<Long> getIntervalTimeByMonth(Date startTime, Date endTime) { List<Long> dateList = new ArrayList<>(); Calendar calendar = Calendar.getInstance(); calendar.setTime(startTime); dateList.add(calendar.getTimeInMillis()); while (calendar.getTimeInMillis() < endTime.getTime()) { // 当月底 calendar.add(Calendar.MONTH, 1 ); calendar.set(Calendar.DAY_OF_MONTH, 1 ); calendar.add(Calendar.DATE, - 1 ); calendar.set(Calendar.HOUR_OF_DAY, 23 ); calendar.set(Calendar.MINUTE, 59 ); calendar.set(Calendar.SECOND, 59 ); if (calendar.getTimeInMillis() >= endTime.getTime()){ dateList.add(endTime.getTime()); break ; } // 下月初 calendar.add(Calendar.DATE, 1 ); calendar.set(Calendar.HOUR_OF_DAY, 0 ); calendar.set(Calendar.MINUTE, 0 ); calendar.set(Calendar.SECOND, 0 ); dateList.add(calendar.getTimeInMillis()); } return dateList; } |
测试的代码如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
|
public static void main(String[] args) throws ParseException { SimpleDateFormat sdf1 = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ); SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd" ); Date beginDate = sdf.parse( "2020-07-15" ); Date endDate = sdf.parse( "2021-07-05" ); List<Long> endDateList = DateUtil.getIntervalTimeByMonth(beginDate, endDate); for ( int i = 0 ; i < endDateList.size(); i++) { Long beginStr = endDateList.get(i); String begin1 = sdf1.format( new Date(beginStr)); System.out.println( "第" + i + "段时间区间:" + begin1); } } |
测试的结果如下所示:
总结
到此这篇关于Java将时间按月份分段的实现思路与方法的文章就介绍到这了,更多相关Java时间按月份分段内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://juejin.cn/post/6981434331457667080