根据首期还款日和分期数两个参数计算每期还款日期(及其他时间相关计算)

话不多说直接上代码

方便自己方便他人main方法中已备好调用方法操作。
如需扩展可自行修改。相关jar包一般项目都应该能找到。大部分jdk自带的!

package com.zeze.common.utils;import org.apache.commons.lang3.time.DateFormatUtils;import com.alibaba.druid.sql.ast.statement.SQLIfStatement.Else;
import com.zeze.common.DateUtil;
import com.zeze.common.StringUtil;import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;/*** 时间计算工具类*/
public class TimeUtils {public static String toTimeString(long time) {TimeUtils t = new TimeUtils(time);int day = t.get(TimeUtils.DAY);int hour = t.get(TimeUtils.HOUR);int minute = t.get(TimeUtils.MINUTE);int second = t.get(TimeUtils.SECOND);StringBuilder sb = new StringBuilder();if (day > 0){sb.append(day).append("天");}if (hour > 0){sb.append(hour).append("时");}if (minute > 0){sb.append(minute).append("分");}if (second > 0){sb.append(second).append("秒");}return sb.toString();}/*** 时间字段常量,表示“秒”*/public final static int SECOND = 0;/*** 时间字段常量,表示“分”*/public final static int MINUTE = 1;/*** 时间字段常量,表示“时”*/public final static int HOUR = 2;/*** 时间字段常量,表示“天”*/public final static int DAY = 3;/*** 各常量允许的最大值*/private final int[] maxFields = { 59, 59, 23, Integer.MAX_VALUE - 1 };/*** 各常量允许的最小值*/private final int[] minFields = { 0, 0, 0, Integer.MIN_VALUE };/*** 默认的字符串格式时间分隔符*/private String timeSeparator = ":";/*** 时间数据容器*/private int[] fields = new int[4];/*** 无参构造,将各字段置为 0*/public TimeUtils() {this(0, 0, 0, 0);}/*** 使用时、分构造一个时间* @param hour      小时* @param minute    分钟*/public TimeUtils(int hour, int minute) {this(0, hour, minute, 0);}/*** 使用时、分、秒构造一个时间* @param hour      小时* @param minute    分钟* @param second    秒*/public TimeUtils(int hour, int minute, int second) {this(0, hour, minute, second);}/*** 使用一个字符串构造时间<br/>* Time time = new Time("14:22:23");* @param time      字符串格式的时间,默认采用“:”作为分隔符*/public TimeUtils(String time) {this(time, null);}/*** 使用时间毫秒构建时间* @param time*/public TimeUtils(long time){this(new Date(time));}/*** 使用日期对象构造时间* @param date*/public TimeUtils(Date date){this(DateFormatUtils.formatUTC(date, "HH:mm:ss"));}/*** 使用天、时、分、秒构造时间,进行全字符的构造* @param day       天* @param hour      时* @param minute    分* @param second    秒*/public TimeUtils(int day, int hour, int minute, int second) {initialize(day, hour, minute, second);}/*** 使用一个字符串构造时间,指定分隔符<br/>* Time time = new Time("14-22-23", "-");* @param time      字符串格式的时间*/public TimeUtils(String time, String timeSeparator) {if(timeSeparator != null) {setTimeSeparator(timeSeparator);}parseTime(time);}/*** 设置时间字段的值* @param field     时间字段常量* @param value     时间字段的值*/public void set(int field, int value) {if(value < minFields[field]) {throw new IllegalArgumentException(value + ", time value must be positive.");}fields[field] = value % (maxFields[field] + 1);// 进行进位计算int carry = value / (maxFields[field] + 1);if(carry > 0) {int upFieldValue = get(field + 1);set(field + 1, upFieldValue + carry);}}/*** 获得时间字段的值* @param field     时间字段常量* @return          该时间字段的值*/public int get(int field) {if(field < 0 || field > fields.length - 1) {throw new IllegalArgumentException(field + ", field value is error.");}return fields[field];}/*** 将时间进行“加”运算,即加上一个时间* @param time      需要加的时间* @return          运算后的时间*/public TimeUtils addTime(TimeUtils time) {TimeUtils result = new TimeUtils();int up = 0;     // 进位标志for (int i = 0; i < fields.length; i++) {int sum = fields[i] + time.fields[i] + up;up = sum / (maxFields[i] + 1);result.fields[i] = sum % (maxFields[i] + 1);}return result;}/*** 将时间进行“减”运算,即减去一个时间* @param time      需要减的时间* @return          运算后的时间*/public TimeUtils subtractTime(TimeUtils time) {TimeUtils result = new TimeUtils();int down = 0;       // 退位标志for (int i = 0, k = fields.length - 1; i < k; i++) {int difference = fields[i] + down;if (difference >= time.fields[i]) {difference -= time.fields[i];down = 0;} else {difference += maxFields[i] + 1 - time.fields[i];down = -1;}result.fields[i] = difference;}result.fields[DAY] = fields[DAY] - time.fields[DAY] + down;return result;}/*** 获得时间字段的分隔符* @return*/public String getTimeSeparator() {return timeSeparator;}/*** 设置时间字段的分隔符(用于字符串格式的时间)* @param timeSeparator     分隔符字符串*/public void setTimeSeparator(String timeSeparator) {this.timeSeparator = timeSeparator;}private void initialize(int day, int hour, int minute, int second) {set(DAY, day);set(HOUR, hour);set(MINUTE, minute);set(SECOND, second);}private void parseTime(String time) {if(time == null) {initialize(0, 0, 0, 0);return;}String t = time;int field = DAY;set(field--, 0);int p = -1;while((p = t.indexOf(timeSeparator)) > -1) {parseTimeField(time, t.substring(0, p), field--);t = t.substring(p + timeSeparator.length());}parseTimeField(time, t, field--);}private void parseTimeField(String time, String t, int field) {if(field < SECOND || t.length() < 1) {parseTimeException(time);}char[] chs = t.toCharArray();int n = 0;for(int i = 0; i < chs.length; i++) {if(chs[i] <= ' ') {continue;}if(chs[i] >= '0' && chs[i] <= '9') {n = n * 10 + chs[i] - '0';continue;}parseTimeException(time);}set(field, n);}private void parseTimeException(String time) {throw new IllegalArgumentException(time + ", time format error, HH"+ this.timeSeparator + "mm" + this.timeSeparator + "ss");}@Overridepublic String toString() {StringBuilder sb = new StringBuilder(16);sb.append(fields[DAY]).append(',').append(' ');buildString(sb, HOUR).append(timeSeparator);buildString(sb, MINUTE).append(timeSeparator);buildString(sb, SECOND);return sb.toString();}private StringBuilder buildString(StringBuilder sb, int field) {if(fields[field] < 10) {sb.append('0');}return sb.append(fields[field]);}public int hashCode() {final int PRIME = 31;int result = 1;result = PRIME * result + Arrays.hashCode(fields);return result;}public boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;final TimeUtils other = (TimeUtils) obj;if (!Arrays.equals(fields, other.fields)) {return false;}return true;}public static Date strToDate(String strDate) {SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");ParsePosition pos = new ParsePosition(0);Date strtodate = formatter.parse(strDate, pos);return strtodate;}public static String strToDate(Date date) {SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");String format = formatter.format(date);return format;}public static String getMonthDate(Date startDate, int month) {LocalDateTime localDateTime = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().plusMonths(month);Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());return strToDate(date);}public static HashMap<Integer, Object> getQuarterlyAndYear(Date startDate, Long num) {num = num - 1L;HashMap<Integer, Object> map = new HashMap<Integer, Object>();for (int i = 1; i <= num + 1; i++) {//时间字符串String monthDate = getMonthDate(startDate, i);//时间格式Date date = strToDate(monthDate);map.put(i, date);}return map;}public static void main(String[] args) {System.out.println(getQuarterlyAndYear(new Date(), 10L));}}

注释也算写的比较详细了,好用请好评。

根据首期还款日和分期数两个参数计算每期还款日期相关推荐

  1. 汇编语言:以“年/月/日 时:分:秒”的格式,显示当前的日期、时间。

    题目:访问cmos ram,用汇编语言编程,以"年/月/日 时:分:秒"的格式,显示当前的日期.时间. 我编写的程序是用直接写显存的方式,在屏幕中间显示系统的当前时间. 但是,有两 ...

  2. 支付宝花呗还款日怎么从每9号调整支付宝花呗还款日为每月15号或每月20号还款?

    支付宝花呗还款日怎么从每9号调整支付宝花呗还款日为每月15号或每月20号还款? 1.打开支付宝,在底部点击[我的]: 2.在支付宝我的里找到花呗,并点击进入: 3.在支付宝花呗的右上角找到[设置]并点 ...

  3. 信用卡超过还款日还款就算不良征信?这么做可以避免逾期!

    小编有一个朋友,他的信用记录一直非常好,无论是贷款还是信用卡,一直都按时还款,而且每次都是提前好几天还,从来没有逾期过. 不过元旦期间他去旅游,可能是玩的太嗨,忘记了1号是他的还款日,到了2号晚上他翻 ...

  4. 苹果手机怎么改时间和日期_花呗还款日期怎么改?支付宝花呗还款日设置修改教程 告别逾期...

    一直以来,花呗账单都是月初出账,最晚必须9号还上.对于那些10号之后发工资的小伙伴来说,由于会逾期几天,而需支付逾期利息.7月30日,支付宝宣布花呗还款日期可以修改啦,小伙伴们可以根据自己发工资日期, ...

  5. 借呗还款日都是一样吗?

    借呗的还款日根据个人第一笔借款的还款日来确定,每个人第一次借款的日期不同,那么还款日也会不同.当然,如果第一次借款发生在同一天,那么两个用户的还款日就会是一样的.借呗还款日一旦确定不支持修改,建议用户 ...

  6. 贷后还款日算法-excel公式

    2018年9月时,跟同事要了风控系统中还款日的算法,自己用excel公式写出了计算每期还款日的函数. 下图是还款日算法.还款日为 :合同日期-1天+(自然月*当期其次). 当合同日为每月第一天.最后第 ...

  7. 信用卡账单日和还款日最长最短免息期是如何计算的

    信用卡账单日和还款日 举例:华夏信用卡的持卡人 账单日是每月的8号,还款日28日 如何才能享受到最长免息期? 在账单日这天各大银行会计算账单日之前消费者的信用卡消费,计算出所有的消费总额和到期还款日的 ...

  8. 北京干细胞研究院“HOPE论坛” 首期 - AI+生命科学 月26日(星期五)14:00-17:30

    "HOPE论坛"以促进学科交叉融合.激发创新思维.培育前沿交叉科研文化为主旨,为海内外优秀学者打造高水平.跨专业.跨学科的学术交流平台. 论坛采取"线上+线下" ...

  9. 筒灯智能驱动芯片作用_如然之光,魅族 Lipro 智能家居发布首期健康照明系列--智能设备 -...

    1 月 5 日,魅族科技(MEIZU)正式发布了 Lipro 智能家居旗下的首期产品,Lipro 健康照明系列.作为 Lipro 品牌的首次产品亮相,Lipro 健康照明系列集顶尖光源品质与优雅工业设 ...

最新文章

  1. Asp.Net Core 入门(一)——Program.cs做了什么
  2. MOSS Single Sign On Setup Step-By-Step( 转)
  3. PYTHON-模块timedatetime+ 目录规范
  4. 优胜劣汰有利于整个团购行业服务的提升
  5. 八、梯度下降法和拟牛顿法
  6. python 网页版笔记_系统学习下python网络爬虫 笔记一
  7. Bootstrap 不可编辑的控件
  8. selenium和python的关系,Selenium+python
  9. Oracle Spatial中SDO_Geometry说明
  10. 收下这份实操案例,还怕不会用Jmeter接口测试工具?!
  11. 建立ssh隧道_快速掌握 SSH 端口转发,助力远程工作
  12. godot python_godot新手教程2[godot常用代码用法]
  13. matplotlib:plot 3d ,plot_surface
  14. win10 同步 android,Win10“你的手机应用更新:支持安卓屏幕镜像和通知同步
  15. CodecContext->gop_size 是什么
  16. CC2530 IIC 4线驱动中景0.96寸OLED屏显示程序,从c51移植过来的
  17. 2022年湖北安全员ABC证书查询是在哪里查真假呢?
  18. JavaScript之时间线(代码解释)
  19. 服务器——SSL/TLS协议信息泄露漏洞(CVE-2016-2183)修复办法
  20. 前端学习从入门到高级全程记录之8 (PS基本使用综合案例)

热门文章

  1. 后端JavaScript所学
  2. ArcGis API for JavaScript学习——加载地图
  3. 淘宝大牛门晒一晒淘宝网技术内幕
  4. DHCP和PPPoE协议以及抓包分析
  5. android 工具箱
  6. 未来的计算机100字的小短文,我的电脑作文100字五篇
  7. Android—内部存储与外部存储、保存图片到相册
  8. 前端 - 用微前端前应该了解的一些知识点
  9. 朗润外盘国际期货:SC原油市场情绪回暖领涨期市
  10. 企业级程序苏林加密系统源码/PHP加密程序源码