1. 场景

  • 在金融类项目中,经常会涉及到利息计算,这里讨论一下按月计息的情况下,月数如何计算

2. 需求分析

  • 前提条件,计算日期差值的时候,留头去尾,举例01.01-01.02差值为1天
  • 月数其实算起来不难,难的是理清楚逻辑,
  • 这里提供一种思路,两个日期之间的实际差值与两个日期所在月份的第一天之间的差值进行对比,以下举例说明
  • 以“2018.01.31”、“2018.11.30”为例
    – 首先2018.11-2018.01 = 10个月
    – 其次2018.11.30-2018.01.31 = 303天
    – 再其次2018.11.01-2018.01.01 = 304天
    – 304天 < 305天,故算出来的10个月即为最终结果

3. 代码逻辑

3.0 以“2018.01.31”、“2018.12.1”为例

3.1 首先计算年月之间的月数差

  • 2018.12-2018.01 = 11个月

3.2 其次计算两个日期之间的实际差值

  • 2018.11.30-2018.01.31 = 304天

3.3 再次计算两个日期取当月第一天的日期,再计算一次日期差值

  • 2018.11.01-2018.01.01 = 334天

3.4 比较3.3和3.2的日期差值大小

  • 304天 < 305天,故算出来的11个月即为最终结果
  • 如果3.2的结果大于3.3的结果,那么在3.1的结果上再加一

4. 代码如下

package cn.zmw;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;public class DuiRi {/*params:Calendar cal1--起始日,Calendar cal2--到期日return:int ret--返回月数,到期日比起始日多了几个月,忽略日期* */public static int getMonth(Calendar cal1, Calendar cal2){int year1= cal1.get(Calendar.YEAR);int year2 = cal2.get(Calendar.YEAR);int month1= cal1.get(Calendar.MONTH);int month2 = cal2.get(Calendar.MONTH);int ret = year2 * 12 + month2 - (year1 * 12 + month1);return ret;}/*params:Calendar cal1--起始日,Calendar cal2--到期日return:int ret--返回两个日期之间的实际差值* */public static int differentDays(Calendar cal1, Calendar cal2){int day1= cal1.get(Calendar.DAY_OF_YEAR);int day2 = cal2.get(Calendar.DAY_OF_YEAR);int year1 = cal1.get(Calendar.YEAR);int year2 = cal2.get(Calendar.YEAR);if(year1 != year2)   //不同年{int timeDistance = 0 ;for(int i = year1 ; i < year2 ; i ++){if((i%4==0 && i%100!=0 )|| i%400==0)    //闰年{timeDistance += 366;}else    //不是闰年{timeDistance += 365;}}return timeDistance + (day2-day1) ;}else//同一年{return day2-day1;}}/*params:Calendar cal--日期return:Date ret--返回输入日期所在月份第一天的日期时间* */public static Date getFirstDayDateOfMonth(Calendar cal){final int last = cal.getActualMinimum(Calendar.DAY_OF_MONTH);cal.set(Calendar.DAY_OF_MONTH, last);return cal.getTime();}public static void main(String[] args) {// 0. 计算两个日期按照年月的月数差值// 1. 计算两个日期按照年月日的差值// 2. 计算两个日期按照年月的差值(取当月第一天)// 3. 比较1和2的结果,如果1>2,在0的结果上加1,否则不做处理// 4. 取3的结果为两个日期之间的月数差值String dateStr1 = "2018-1-31 1:21:28";String dateStr2 = "2018-12-1 1:21:28";SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");try{Date date2 = format2.parse(dateStr2);Date date1 = format1.parse(dateStr1);Calendar cal1 = Calendar.getInstance();cal1.setTime(date1);Calendar cal2 = Calendar.getInstance();cal2.setTime(date2);//0. 计算两个日期按照年月的月数差值int months = getMonth(cal1,cal2);System.out.println("两个日期的月数差距:" + months);// 1. 计算两个日期按照年月日的差值int days1 = differentDays(cal1,cal2);System.out.println("两个日期的实际差距:" + days1);Date date4 = getFirstDayDateOfMonth(cal2);Date date3 = getFirstDayDateOfMonth(cal1);Calendar cal3 = Calendar.getInstance();cal3.setTime(date3);Calendar cal4 = Calendar.getInstance();cal4.setTime(date4);// 2. 计算两个日期按照年月的差值(取当月第一天)int days2 = differentDays(cal3,cal4);System.out.println("两个日期的差距:" + days2);if(days2 < days1){// 月数 加1months += 1;}else{// 月数 不变}System.out.println("两个日期的月数差距:" + months);} catch (ParseException e) {e.printStackTrace();}}
}

两个日期月数差值计算相关推荐

  1. java 计算两个日期相差月数_Java简单计算两个日期月数差的方法

    本文实例讲述了Java简单计算两个日期月数差的方法.分享给大家供大家参考,具体如下: /** * 获取两个日期相差的月数 * @param d1 较大的日期 * @param d2 较小的日期 * @ ...

  2. 两个日期之间的差值计算

    两个日期之间的差值计算 近期在写关于计算时间之间的业务处理,当中的各种差值语法初六汇总 1.前端(以JQUERY为例) 语法:核心:采用时间戳的相减方式 //以当前时间减去制定日期计算相差的时间 va ...

  3. 怎么计算两个日期之间的差值

    写程序时会遇到比较两个日期之间的差值,差了多少天,或者其他什么,于是自己写了一个方法,供大家参考,也作为自己的备份吧. 日期之间的差值:差了多少天function DateDiff(sDate1, s ...

  4. 使用joda_time计算两时间的月数差,天数差

    private static final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd") ...

  5. js计算两个日期时间的差值

    1,计算两个时间的差值: let date1 = new Date('2020-12-02 12:30:54')let date2 = new Date('2020-12-02 15:38:09')l ...

  6. oracle中计算两个日期之间的差值

    2016年10月29日 阅读数:10503 最近几天在工作中用到了一项计算时间的功能,计算两个时间之间的天数差,顺道总结一下oracle中的语句:两个Date类型字段:START_DATE,END_D ...

  7. python怎么输入两个数然后求差值_python两个日期之间天差值获取

    因为我也刚刚接触python,这个原则上也是百度找到的,原来那位我也找不到了...... 主要就是使用datetime进行转化然后进行相减,获得如[diff_days] : 00:00:00形式的结果 ...

  8. iOS 计算两个日期之间的差值

    NSDateFormatter *dateFomatter = [[NSDateFormatter alloc] init];dateFomatter.dateFormat = @"yyyy ...

  9. mysql timestamp 差值_MySQL中TIMESTAMPDIFF和TIMESTAMPADD函数的用法(两个日期之间的差值)...

    MySQL中TIMESTAMPDIFF和TIMESTAMPADD函数的用法 在应用时,经常要使用这两个函数TIMESTAMPDIFF和TIMESTAMPADD. 一,TIMESTAMPDIFF 语法: ...

最新文章

  1. Struts的select两种遍历方法
  2. 成人高考报计算机还是学前教育,成人高考读什么专业比较好 三大热门专业
  3. 一种近似方法将场地坐标转为像素坐标
  4. Hadoop详解(七):YARYN完全分布式环境搭建
  5. 【教女朋友学网络系列5】之VLAN与Trunk、单臂路由
  6. TypeScript 素描 - 模块解析、声明合并
  7. python分析nginx日志
  8. 【GIF动画+完整可运行源代码】C++实现 计数排序——十大经典排序算法之八
  9. 你是否做好了代码的备份?
  10. [转]Android中pendingIntent的深入理解
  11. ORACLE1.21 PLSQL 01
  12. Kafka启动报错:Timed out waiting for connection while in state: CONNECTING
  13. rabbitmq 消费端代码获取队列名称_RabbitMQ四:生产者--队列--消费者
  14. 《编写可维护的 JavaScript》读书笔记第7章:事件处理
  15. 力士乐电源模块故障代码_REXROTH DRIVE博士力士乐伺服驱动器故障代码大全
  16. # 你也可以在你的微信 or QQ头像添加小国旗了,超简单!
  17. Codeforces1183 E. Subsequences (easy version)(bfs)
  18. APK Multi-Tool(反编译工具)教程
  19. 2019年第十届蓝桥杯[Java]
  20. AIX PowerPC体系结构及其溢出技术学习笔记

热门文章

  1. 好问题:为什么有些大公司技术弱爆了?
  2. RabbitMQ 安装及常用操作命令
  3. 计算机基础是不是java_计算机基础与java
  4. python pdf转图片 poppler_Python将PDF转成图片—PyMuPDF和pdf2image
  5. varargin、varargout、nargin和nargout的使用方法
  6. Linux-hostname查看及修改
  7. 碳云智能CEO王俊:大数据基础上人人都将活到120岁 | 2017 IT领袖峰会
  8. EE308_Lab1
  9. kindle的下载电子书的资源网站
  10. kubectl源码分析之cordon and uncordon