1. 判断时间段是否合法;

2. 循环判断记录数是否大于0

3. 根据起始时间算出该月的第一天、最后一天和这个月有多少天;

4. 判断起始时间是否是该月第一天,如果是,再判断结束时间与该月最后一天的大小:小于,等于,大于;

5. 判断起始时间是否是该月第一天,如果不是,再判断结束时间与该月最后一天的大小:小于,等于,大于;

这里的LocalDate是Java8中的时间类,只有日期,没有时分秒等;如2018-03-26。

下面函数仅仅只需要接受两个LocalDate参数(一个时间段),就可以获得该时间段内由哪些日期和哪些月份组成;

Date、long转LocalDate等更多时间常用操作可以参考:https://www.cnblogs.com/theRhyme/p/9756154.html

具体代码如下:

public void accordingToCountCalcData(LocalDate start,LocalDate end){

    //这里的count表示自定义时间段内需要累加的记录的条数
final long count = end.toEpochDay() - start.toEpochDay() + 1;
if(count < 1){
log.error("startTime can't greater than endTime",new IllegalArgumentException("startTime can't greater than endTime"));
return;
}
log.info("******BEGIN: There are {} records between {} and {}. ******",count,start,end); long num = count;
while(num > 0) {
LocalDate firstDay = start.with(TemporalAdjusters.firstDayOfMonth());
LocalDate lastDay = start.with(TemporalAdjusters.lastDayOfMonth()); //该月有多少天
int dayOfMonth = lastDay.getDayOfMonth(); if (firstDay.compareTo(start) == 0) {
//传入的起始时间如果是当月的第一天 if (lastDay.compareTo(end) == 0) {
//传入的结束时间和开始时间构成了完整一个月 num = num - lastDay.getDayOfMonth();
log.info("{} and {} which making up a full month",firstDay,lastDay); } else if (end.compareTo(lastDay) > 0) { //包含了完整的一个月 log.info("Accumulating {} to {} , {} records",start,lastDay,dayOfMonth); num = num - dayOfMonth; //下个月的这天
start = start.minusMonths(-1);
//下个月的1号
start = LocalDate.of(start.getYear(),start.getMonthValue(),1); } else if (end.compareTo(lastDay) < 0) { log.info("Accumulating {} to {} , {} records.",start,end,num);
num = 0;
}
}else if(start.compareTo(firstDay) > 0) {
//传入的开始时间不是当前月的第一天
if (end.compareTo(lastDay) <= 0) { log.info("Accumulating {} to {} , {} records.", start, end, num);
num = 0;
} else if (end.compareTo(lastDay) > 0) {
//先累加从开始时间到这个月最后一天的记录 Period p = Period.between(start, lastDay);
//这里还减1是因为两个日期如果相差11天,就有12条纪录
int records = p.getDays() + 1; log.info("Accumulating {} to {} , {} records.", start, lastDay, records);
num = num - records;
//下个月的这天
start = start.minusMonths(-1);
//下个月的1号
start = LocalDate.of(start.getYear(), start.getMonthValue(), 1); }
}
} log.info("****** End: Function \"accordingToCountCalcData\". ******"); }

测试结果如下:

在线日期工具:

https://tool.lu/timestamp/

http://www.ab126.com/clock/1639.html

https://bjtime.cn/riqi/

Java8给出一个时间段,计算该时间范围由哪些日期(天)和月份组成的更多相关文章

  1. 给出两个单词word1和word2,写一个函数计算出将word1 转换为word2的最少操作次数。

    问题: 给出两个单词word1和word2,写一个函数计算出将word1 转换为word2的最少操作次数. 你总共三种操作方法: 1.插入一个字符 2.删除一个字符 3.替换一个字符 格式: 输入行输 ...

  2. ZT CSDN 如何以最快的速度计算出一个二进制数中1的个数? [

    一道算法面试题:如何以最快的速度计算出一个二进制数中1的个数? [问题点数:10分,结帖人weicai_chen] 收藏 weicai_chen weicai_chen 等级: 结帖率:95.12% ...

  3. android穿越之旅--如何弹出一个非比寻常的窗体

    上一篇中介绍了一种闻所未闻在android执行java命令的方法,虽然这是一种非常"高级"的技术,然后并没有什么卵用,因此被移除了博客园首页.实际上也并不是一点用处也没有,对已立即 ...

  4. 学了C语言,如何写个程序计算出每个月的第一个星期一对应的日期

    在前面,我们分别利用泰勒公式和C标准库中的mktime()函数推算了某个特定日期所对应的星期几,刚做完这些,就又遇到了一个与日期相关的新任务: 老板把每个月例会的时间定在了每个月的第一个星期一,他让我 ...

  5. 输入一个数字n 如果n为偶数则除以2,若为奇数则加1或者减1,直到n为1,求最少次数 写出一个函数

    题目: 输入一个数字n  如果n为偶数则除以2,若为奇数则加1或者减1,直到n为1,求最少次数  写出一个函数 首先,这道题肯定可以用动态规划来解, n为整数时,n的解为 n/2 的解加1 n为奇数时 ...

  6. item 6: 当auto推导出一个不想要的类型时,使用显式类型初始化的语法

    本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 Item 5解释了比起显式指定类型,使用auto来 ...

  7. 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数rand10(),该函数能够生成1-10的随机数。

    题目: 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数,该函数能够生成1-10的随机数. 思路: 假如已知一个函数能够生成1-49的随机数,那么如何以此生成1-10的随机数呢? 解法 ...

  8. jQuery 学习笔记2 点击时弹出一个对话框

    上次学习的是页面加载完成后弹出一个警告框,这里我们改为当用户点击后弹出一个警告框. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans ...

  9. 题目一:给出一个n,代表有从1到n的数字[1,2,3,··· n],问可以构成多少种二叉搜索树?

    题目一:给出一个n,代表有从1到n的数字[1,2,3,··· n],问可以构成多少种二叉搜索树? 一开始的想法是直接递归构造,时间复杂度是指数上升:后来想法是找规律:先看例子: n = 1, 有一个元 ...

随机推荐

  1. Android Activity传递数据使用getIntent()接收不到,揭秘Intent传递数据与Activity启动模式singleTask的关系。

    activity通过intent传递数据的时候,如果activity未启动,那么在这个刚启动的activity里通过getIntent()会获取到这个intent的数据.. 如果要启动的activit ...

  2. 查看linux的IO占用

    iotop -oPiostat -xm 1 iostat -d -x -kiostat -c top

  3. JVM总结-字节码

    在运行过程中,每当调用进入一个 Java 方法,Java 虚拟机会在当前线程的 Java 方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数.这个栈帧的大小是提前计算好的,而且 Java 虚拟机 ...

  4. Maven依赖下载速度慢,不用怕,这么搞快了飞起

    一.背景 众所周知,Maven对于依赖的管理让我们程序员感觉爽的不要不要的,但是由于这货是国外出的,所以在我们从中央仓库下载依赖的时候,速度如蜗牛一般,让人不能忍,并且这也是大多数程序员都会遇到的问题 ...

  5. (转)CSS3:nth-child()伪类选择器,奇偶数行自定义样式first-child

    原文地址 Table表格奇偶数行定义样式: CSS3的强大,让人惊叹,人们在惊喜之余,又不得不为其艰难的道路感到可惜:好的标准只有得到行业浏览器的良好支持才算得上“标准”.CSS3标 准已提出数年,但 ...

  6. 学习笔记:CommonJS规范、AMD规范

    CommonJS规范 http://wiki.jikexueyuan.com/project/webpack-handbook/commonjs.html CommonJS 规范 http://www ...

  7. 57.纯 CSS 创作一双黑暗中的眼睛

    原文地址:https://segmentfault.com/a/1190000015327725 感想:原来边框还能这样玩-->做会眨眼的眼睛 HTML code: <div class= ...

  8. java中的排序--排序容器_TreeSet与TreeMap

    1.TreeSet:数据元素可以排序且不可重复. 对比: (1)Set接口:HashSet,元素必须重写hashcode和equals方法. (2)TreeSet:只要可以排序即可.去重:比较等于0即 ...

  9. python学习笔记_week13

    一.前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多人觉得,堡垒机就是跳板机,其实这个认识是不全面的,跳板功能只是堡垒机所具备的功能属性中的 ...

  10. APP-8.2-Postman应用

    用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具.今天给大家介绍的这款网页调试工具不仅可以 ...