前言

有时候我们得到一段时间,需要将时间按照月份将这一段时间来分段。比如开始时间为 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对象

calendar calendar = calendar.getinstance();

设置日历的时间

date time = new date;
calendar.settime(time);

获取日历中的时间(年月日)

calendar.set(calendar.year, 2021); // 年
calendar.add(calendar.month, 1); // 月
calendar.set(calendar.day_of_month, 1); // 日

二、思路分析

大概的实现思路就是:从开始时间开始,以累加的方式逐月增加,直到当前时间大于结束时间则停止叠加。

要注意的是,即使当前时间大于结束时间也需要把结束时间添加到结果集中。因为最后一个时间段是从月初到结束日期的。

三、实现方案

实现的方式就和思路中是一样的,一些注释都写在代码中了,如下图所示:

/**
 * 按照月份分割一段时间
 *
 * @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;
}

测试的代码如下所示:

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时间按月份分段内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!