完成时间工具的改造

This commit is contained in:
彭宇琦 2021-01-23 19:23:37 +08:00
parent 44085613d1
commit 47d154dc4f
2 changed files with 169 additions and 19 deletions

View File

@ -257,9 +257,10 @@ public class Time implements Comparable<Time> {
}
/**
* 用于返回设置时间的格式化后的时间若通过{@link #Time(String)}构造
* {@link #initTime(String)}方法创建的时间则按照原格式进行返回若通过其他方法 创建的时间则按照默认的yyyy-MM-dd
* HH:mm:ss格式进行返回
* 用于以指定的格式返回格式化后的时间
* <p>
* 若未设置时间格式则默认按照yyyy-MM-dd HH:mm:ss的格式进行返回
* </p>
*
* @return 格式化后的时间
*/
@ -274,13 +275,28 @@ public class Time implements Comparable<Time> {
public LocalDateTime getLocalDateTime() {
return LocalDateTime.of(calculateTime.toLocalDate(), calculateTime.toLocalTime());
}
/**
* 用于以{@link Time}的形式返回初始化时设置的时间
* @return 始化时设置的时间
*/
public Time getInitTime() {
return Time.parse(initTime);
}
/**
* 用于以{@link Time}的形式将设置后的时间作为初始时间进行返回
* @return 始化时设置的时间
*/
public Time getCalculateTime() {
return Time.parse(calculateTime);
}
/**
* 用于还原初始化时设置的日期/时间
*/
public Time initTime() {
calculateTime = initTime;
return this;
}
@ -304,16 +320,12 @@ public class Time implements Comparable<Time> {
}
/**
* 用于根据传入的增减时间的规则对时间进行增减
* <p>
* 用于根据传入的增减时间的规则对时间进行增减传入需要修改的时间单位
* 根据单位前的数值对单位进行增减例如需要对当前设置的时间增加1年3个月又5天并较少2小时30分钟45秒
* 根据单位前的数值对指定的单位进行增减例如需要对当前设置的时间增加1年3个月又5天并较少2小时30分钟45秒
* 此时可以传入1年3月5日-2时-30分-45秒亦可以传入1y3m5d-2h-30min-45s
* </p>
* <p>
* 注意
* <ol>
* <li>单位必须准确允许传入以下单位
* <ul>
* 可传入的单位有
* <li>年单位yY</li>
* <li>月单位mM</li>
* <li>周单位wW</li>
@ -322,14 +334,8 @@ public class Time implements Comparable<Time> {
* <li>分钟单位minMIN</li>
* <li>秒单位sS</li>
* </ul>
* </li>
* <li>允许传入小数但年月传入小数时按照自然年及自然月计算即1年365天不考虑闰年
* 1月30天不考虑大月与二月例如传入5.3y2.5h则5.3年转换为5.3 * 365天计算 2.5小时将转化为增加2.5 *
* 60分钟计算建议不要在年月中传入小数否则可能导致计算失真</li>
* </ol>
* 具体的计算规则与{@link #addTime(double, TimeUnit)}方法一致
* </p>
*
*
* @param regex 时间规则
* @return 返回修改后的时间戳
*/
@ -522,4 +528,73 @@ public class Time implements Comparable<Time> {
return false;
return true;
}
/**
* 用于根据最小比较单位对时间进行比较
* <p>
* 通过指定最小比较单位从而返回该单位及以上单位的对比结果例如
* <ul>
* 假定有如下两个日期
* <code><pre>
* Time t1 = Time.parse("2020-12-10 17:22:12");
* Time t2 = Time.parse("2020-12-10 20:27:12");
* </pre></code>
* <li>当调用{@code t1.equalsForUnit(t2, TimeUnit.SECOND)}则返回结果为false</li>
* <li>当调用{@code t1.equalsForUnit(t2, TimeUnit.DAY)}则返回结果为true</li>
* </ul>
* </p>
* <p>
* <b>注意</b>{@link TimeUnit#YEAR}{@link TimeUnit#MONTH}{@link TimeUnit#DAY}
* {@link TimeUnit#HOUR}{@link TimeUnit#MINUTE}{@link TimeUnit#SECOND}单位外其他的
* 单位传入进行判断时会抛出异常
* </p>
* @param compareTime 需要比对的时间
* @param timeUnit 最小判断单位
* @return 对比结果
* @throws IncorrectConditionException 单位传入有误时抛出的异常
*/
public boolean equalsForUnit(Time compareTime, TimeUnit timeUnit) {
if (compareTime == null || timeUnit == null) {
return false;
}
boolean result = equals(compareTime);
//若两时间一致则直接返回true
if (result) {
return result;
}
switch (timeUnit) {
case SECOND:
result = (compareTime.getLocalDateTime().getSecond() == calculateTime.getSecond());
if (!result) {
return result;
}
case MINUTE:
result = (compareTime.getLocalDateTime().getMinute() == calculateTime.getMinute());
if (!result) {
return result;
}
case HOUR:
result = (compareTime.getLocalDateTime().getHour() == calculateTime.getHour());
if (!result) {
return result;
}
case DAY:
result = (compareTime.getLocalDateTime().getDayOfMonth() == calculateTime.getDayOfMonth());
if (!result) {
return result;
}
case MONTH:
result = (compareTime.getLocalDateTime().getMonth() == calculateTime.getMonth());
if (!result) {
return result;
}
case YEAR:
result = (compareTime.getLocalDateTime().getYear() == calculateTime.getYear());
return result;
default:
throw new IncorrectConditionException("无法比较的单位:" + timeUnit);
}
}
}

View File

@ -1,5 +1,6 @@
package com.auxiliary.tool.date;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Random;
@ -53,7 +54,7 @@ public class TimeUtil {
* @return 随机的时间
*/
public static Time randomTime(Time startTime, Time endTime, TimeUnit timeUnit) {
// 帕努单传入的对象是否为空
// 判断传入的对象是否为空
if (startTime == null || endTime == null || timeUnit == null) {
throw new IncorrectConditionException(String
.format("必须指定时间范围与最小变动单位:[startTime:%s, endTime:%s, timeUnit:%s]", startTime, endTime, timeUnit));
@ -127,4 +128,78 @@ public class TimeUtil {
public static Time randomTime(Time time, TimeUnit timeUnit) {
return randomTime(Time.parse(), time, timeUnit);
}
/**
* 用于计算指定时间与待比较时间之间差值并以{@link Duration}的形式对计算结果进行返回
* @param time 指定时间
* @param compareTime 待比较时间
* @return 两时间的差值
*/
public static Duration timeDifference(Time time, Time compareTime) {
// 判断传入的对象是否为空
if (time == null || compareTime == null) {
throw new IncorrectConditionException(String
.format("必须指定时间范围与最小变动单位:[time:%s, compareTime:%s]", time, compareTime));
}
return Duration.between(time.getLocalDateTime(), compareTime.getLocalDateTime());
}
/**
* 用于计算指定时间与待比较时间之间各个单位的差值并以{@link Map}的形式进行返回
* <p>
* 在返回值中其键为时间单位值为该单位的差值
* </p>
* @param time 指定时间
* @param compareTime 待比较时间
* @return 两时间的差值
*/
/* TODO 暂时搁置 未想到解决借位或精度的解决办法
public static Map<TimeUnit, Integer> timeDifferenceToMap(Time time, Time compareTime) {
// 判断传入的对象是否为空
if (time == null || compareTime == null) {
throw new IncorrectConditionException(String
.format("必须指定时间范围与最小变动单位:[time:%s, compareTime:%s]", time, compareTime));
}
//存储转换单位后的数据
Map<TimeUnit, Integer> UnitMap = new HashMap<>();
TimeUnit unit = TimeUnit.YEAR;
//循环直到毫秒值小于1000时单位已计算至毫秒结束
while(unit != null) {
int value = 0;
switch (unit) {
case YEAR:
value = time.getLocalDateTime().getYear() - compareTime.getLocalDateTime().getYear();
unit = TimeUnit.MONTH;
break;
case MONTH:
value = time.getLocalDateTime().getMonthValue() - compareTime.getLocalDateTime().getMonthValue();
if (value < 0) {
UnitMap.put(TimeUnit.YEAR, UnitMap.get(TimeUnit.YEAR) - 1);
value = 12 + value;
}
unit = TimeUnit.DAY;
break;
case DAY:
unit = TimeUnit.HOUR;
break;
case HOUR:
unit = TimeUnit.MINUTE;
break;
case MINUTE:
unit = TimeUnit.SECOND;
break;
case SECOND:
default:
unit = null;
break;
}
UnitMap.put(unit, value);
}
return UnitMap;
}
*/
}