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

(0)

相关推荐

  • Java编程实现计算两个日期的月份差实例代码

    本文实例主要实现计算两个日期的月份差,具体如下: package com.forezp.util; import org.joda.time.DateTime; import org.joda.time.Months; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; /** * 在JAVA中,如何计算两个日期的月份差?<br> * * * @author Adm

  • Java对日期Date类进行加减运算、年份加减月份加减、时间差等等

    实现代码一: import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class DateTestUtil { public static void main(String[] args) throws Exception { SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd"); String str=&

  • 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中的 Calend

  • Java 进行时间处理的步骤

    一.Calendar (1).Calender介绍 Calendar的中文翻译是日历,实际上,在历史上有着许多种计时的方法.所以为了计时的统一,必需指定一个日历的选择.那现在最为普及和通用的日历就是"Gregorian Calendar".也就是我们在讲述年份时常用"公元**年".Calendar 在 Java 中是一个抽象类(Abstract Class),GregorianCalendar 是它的一个具体实现.Calendar.getInstance()中所获得

  • Java日期时间以及日期相互转换

    Java日期时间,以及相互转化,供大家参考,具体内容如下 package com.study.string; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class DateBase { public static voi

  • Java日期时间使用方法汇总

    一.Java中的日期概述 日期在Java中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,日期和时间之间的转换,日期的加减运算,日期的展示格式都是非常复杂的问题. 在Java中,操作日期主要涉及到一下几个类:  1.java.util.Date         类 Date 表示特定的瞬间,精确到毫秒.从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和分析日期字符串.Date 中的把日期解释为年.月

  • Java日期时间格式化操作DateUtils 的整理

    Java日期时间格式化操作DateUtils 的整理 直接上代码,总结了开发过程中经常用到的日期时间格式化操作! import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.concurrent.TimeUnit; /** * ClassName: DateUtils <br/> * D

  • java日期时间操作工具类

    本文实例为大家分享了java日期时间操作工具类,供大家参考,具体内容如下 虽然jdk1.8开始,加入了time包,里面对时区,本地化时间,格式化,以及时间等做了很好的封装,但仍然要写一个工具类.大家看着用.应该没有bug.如果发现了,请您一定告知,互相学习!好了,上代码: package com.wdy.tools.utils.timeutil; import java.text.DateFormat; import java.text.SimpleDateFormat; import java

  • Java中时间API的基本使用教程

    1. 时区概念 国际经度会议(又称国际子午线会议)上,规定将全球划分为24个时区(东.西各12个时区).规定英国的格林尼治天文台旧址为中时区(零时区).东1-12区,西1-12区.每个时区横跨经度15度,时间正好是1小时.最后的东.西第12区各跨经度7.5度,以东.西经180度为界.每个时区的中央经线上的时间就是这个时区内统一采用的时间,称为区时,相邻两个时区的时间相差1小时.英国(格林尼治天文台旧址)为本初子午线,即零度经线. 时区的表格划分 为什么全世界不使用统一的时间 于各个地区所在地球位

  • Java日期时间及日期相互转换实现代码

    这篇文章主要介绍了Java日期时间及日期相互转换实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java.util 包提供了 Date 类来封装当前的日期和时间. Date 类提供两个构造函数来实例化 Date 对象. 第一个构造函数使用当前日期和时间来初始化对象. Java日期时间,以及相互转化,供大家参考,具体内容如下 package com.study.string; import java.text.ParseException

  • Java Date时间类型的操作实现

    本文主要介绍Java Date 日期类型,以及Calendar的怎么获取时间,然后写成时间工具类里面有下面这些方法: - 时间转字符串(有默认时间格式,带时间格式) - 字符串转时间(有默认时间格式,带时间格式) - 计算两个日期之间相差的天数 - 计算当前时间多少天以后的日期 - 判断是否是日期格式 代码 很多说明都注释在代码上: package datedemo; import java.text.SimpleDateFormat; import java.util.Calendar; im

  • Java日期时间类及计算详解

    目录 1. Java中与日期相关的类 1.1 java.util包 ① Date类 ② Calendar 日历类 roll 设置Calendar的容错性 set 1.2 java.time包 ① LocalDate 本地日期类 ② LocalTime 本地时间类 ③ LocalDateTime 本地日期时间类 ④ Instant 类 ⑤ Period 类 ⑥ Duration 类 2. 时间间隔计算 2.1 Period与Duration类 2.1.1 Duration 2.1.2 Period

随机推荐