Java将时间按月份分段的实现思路与方法

 更新时间:2021年07月07日 15:21:40   作者:四级  
这篇文章主要给大家介绍了关于Java将时间按月份分段的实现思路与方法,通过文中介绍的方法可以将时间分成我们想要的时间段,文中给出了详细的实例代码,需要的朋友可以参考下

前言

有时候我们得到一段时间,需要将时间按照月份将这一段时间来分段。比如开始时间为 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时间按月份分段内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot整合企微webhook机器人发送消息提醒

    springboot整合企微webhook机器人发送消息提醒

    这篇文章主要为大家介绍了springboot整合企微webhook机器人发送消息提醒,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 使用Java实现加密之AES加解密

    使用Java实现加密之AES加解密

    这篇文章主要介绍了使用Java实现加密之AES加解密,AES为最常见的对称加密算法,对称加密算法也就是加密和解密用相同的密钥,需要的朋友可以参考下
    2023-05-05
  • java的finalize方法解读

    java的finalize方法解读

    这篇文章主要介绍了java的finalize方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 微服务实战之怎样提升springboot服务吞吐量

    微服务实战之怎样提升springboot服务吞吐量

    这篇文章主要介绍了微服务实战之怎样提升springboot服务吞吐量方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Spring基于advisor配置aop过程解析

    Spring基于advisor配置aop过程解析

    这篇文章主要介绍了Spring基于advisor配置aop过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java 轻松掌握字符缓冲流的使用

    Java 轻松掌握字符缓冲流的使用

    这篇文章主要介绍了Java的字符缓冲流用法,字符缓冲流的用途很多,主要是几个构造方法的使用,在项目开发中经常会用到,需要的朋友参考下吧
    2022-04-04
  • SpringCloud安装Nacos完成配置中心

    SpringCloud安装Nacos完成配置中心

    如果不满足上篇文章的eureka注册中心,那么本文记录的Nacos是不二之选。本文主要记录Springboot基于Nacos实现配置中心
    2022-07-07
  • Java数据结构实现二维数组与稀疏数组转换详解

    Java数据结构实现二维数组与稀疏数组转换详解

    稀疏数组是用于优化,压缩具有以下特点的二维数组:当二维数组中的元素大部分相同,有意义的数据元素较少时,可以使用稀疏数组进行简化,节省存储空间
    2021-10-10
  • springboot 文件上传大小配置的方法

    springboot 文件上传大小配置的方法

    本篇文章主要介绍了springboot 文件上传大小配置的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Java中的BlockingQueue接口源码解析

    Java中的BlockingQueue接口源码解析

    这篇文章主要介绍了Java中的BlockingQueue接口源码解析,BlockingQueue接口表示阻塞队列,是Java并发包中阻塞队列的接口定义规范,阻塞队列意味着对于该队列的操作是线程安全的,当多个线程存放元素进入队列或者从队列中取出元素都是线程安全的,需要的朋友可以参考下
    2023-11-11

最新评论