根据首期还款日和分期数两个参数计算每期还款日期
根据首期还款日和分期数两个参数计算每期还款日期(及其他时间相关计算)
话不多说直接上代码
方便自己方便他人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));}}
注释也算写的比较详细了,好用请好评。
根据首期还款日和分期数两个参数计算每期还款日期相关推荐
- 汇编语言:以“年/月/日 时:分:秒”的格式,显示当前的日期、时间。
题目:访问cmos ram,用汇编语言编程,以"年/月/日 时:分:秒"的格式,显示当前的日期.时间. 我编写的程序是用直接写显存的方式,在屏幕中间显示系统的当前时间. 但是,有两 ...
- 支付宝花呗还款日怎么从每9号调整支付宝花呗还款日为每月15号或每月20号还款?
支付宝花呗还款日怎么从每9号调整支付宝花呗还款日为每月15号或每月20号还款? 1.打开支付宝,在底部点击[我的]: 2.在支付宝我的里找到花呗,并点击进入: 3.在支付宝花呗的右上角找到[设置]并点 ...
- 信用卡超过还款日还款就算不良征信?这么做可以避免逾期!
小编有一个朋友,他的信用记录一直非常好,无论是贷款还是信用卡,一直都按时还款,而且每次都是提前好几天还,从来没有逾期过. 不过元旦期间他去旅游,可能是玩的太嗨,忘记了1号是他的还款日,到了2号晚上他翻 ...
- 苹果手机怎么改时间和日期_花呗还款日期怎么改?支付宝花呗还款日设置修改教程 告别逾期...
一直以来,花呗账单都是月初出账,最晚必须9号还上.对于那些10号之后发工资的小伙伴来说,由于会逾期几天,而需支付逾期利息.7月30日,支付宝宣布花呗还款日期可以修改啦,小伙伴们可以根据自己发工资日期, ...
- 借呗还款日都是一样吗?
借呗的还款日根据个人第一笔借款的还款日来确定,每个人第一次借款的日期不同,那么还款日也会不同.当然,如果第一次借款发生在同一天,那么两个用户的还款日就会是一样的.借呗还款日一旦确定不支持修改,建议用户 ...
- 贷后还款日算法-excel公式
2018年9月时,跟同事要了风控系统中还款日的算法,自己用excel公式写出了计算每期还款日的函数. 下图是还款日算法.还款日为 :合同日期-1天+(自然月*当期其次). 当合同日为每月第一天.最后第 ...
- 信用卡账单日和还款日最长最短免息期是如何计算的
信用卡账单日和还款日 举例:华夏信用卡的持卡人 账单日是每月的8号,还款日28日 如何才能享受到最长免息期? 在账单日这天各大银行会计算账单日之前消费者的信用卡消费,计算出所有的消费总额和到期还款日的 ...
- 北京干细胞研究院“HOPE论坛” 首期 - AI+生命科学 月26日(星期五)14:00-17:30
"HOPE论坛"以促进学科交叉融合.激发创新思维.培育前沿交叉科研文化为主旨,为海内外优秀学者打造高水平.跨专业.跨学科的学术交流平台. 论坛采取"线上+线下" ...
- 筒灯智能驱动芯片作用_如然之光,魅族 Lipro 智能家居发布首期健康照明系列--智能设备 -...
1 月 5 日,魅族科技(MEIZU)正式发布了 Lipro 智能家居旗下的首期产品,Lipro 健康照明系列.作为 Lipro 品牌的首次产品亮相,Lipro 健康照明系列集顶尖光源品质与优雅工业设 ...
最新文章
- Asp.Net Core 入门(一)——Program.cs做了什么
- MOSS Single Sign On Setup Step-By-Step( 转)
- PYTHON-模块timedatetime+ 目录规范
- 优胜劣汰有利于整个团购行业服务的提升
- 八、梯度下降法和拟牛顿法
- python 网页版笔记_系统学习下python网络爬虫 笔记一
- Bootstrap 不可编辑的控件
- selenium和python的关系,Selenium+python
- Oracle Spatial中SDO_Geometry说明
- 收下这份实操案例,还怕不会用Jmeter接口测试工具?!
- 建立ssh隧道_快速掌握 SSH 端口转发,助力远程工作
- godot python_godot新手教程2[godot常用代码用法]
- matplotlib:plot 3d ,plot_surface
- win10 同步 android,Win10“你的手机应用更新:支持安卓屏幕镜像和通知同步
- CodecContext->gop_size 是什么
- CC2530 IIC 4线驱动中景0.96寸OLED屏显示程序,从c51移植过来的
- 2022年湖北安全员ABC证书查询是在哪里查真假呢?
- JavaScript之时间线(代码解释)
- 服务器——SSL/TLS协议信息泄露漏洞(CVE-2016-2183)修复办法
- 前端学习从入门到高级全程记录之8 (PS基本使用综合案例)