Skip to content

Commit

Permalink
Merge pull request #84 from xkzhangsan/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
xkzhangsan authored Jul 17, 2021
2 parents e266b24 + c939284 commit 6139c5f
Show file tree
Hide file tree
Showing 6 changed files with 262 additions and 129 deletions.
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#3.2.0

## 1 新功能
(1)TimeNLPUtil增加多种调用方式,比如parseConcurrent 并发执行,可设置超时时间和自定义线程池等,提高执行效率。(Mini版无TimeNLPUtil功能)

(2)DateTimeCalculatorUtil判断2个或多个时间段是否有重叠(交集)方法

(3)DateTimeCalculatorUtil增加计算平均时间方法

(4)DateTimeCalculatorUtil增加根据毫秒值计算倒计时方法

(5)DateTimeCalculatorUtil中getDateList获取日期列表方法,增加获取间隔指定单位的相同时间,比如每月的15号日期列表。

(6)DateTimeCalculatorUtil中isChineseWorkDay工作日计算,使用本地缓存优化,提高性能。

## 2 修复bug
---
6 changes: 5 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,11 @@ xk-time工具包,将上面功能按照时间转换,时间计算,时间格
节假日数据holidayData,如果节假日数据不支持年份,将使用周一到周五为工作日来判断。 下面是我整理的2021年放假信息:
2021-01-01:0,2021-02-07:1,2021-02-11:0,2021-02-12:0,2021-02-15:0,2021-02-16:0,2021-02-17:0,2021-02-20:1,2021-04-05:0,2021-04-25:1,2021-05-03:0,2021-05-04:0,2021-05-05:0,2021-05-08:1,2021-06-14:0,2021-09-18:1,2021-09-20:0,2021-09-21:0,2021-09-26:1,2021-10-01:0,2021-10-04:0,2021-10-05:0,2021-10-06:0,2021-10-07:0,2021-10-09:1

(26)判断2个时间段是否有重叠(交集)方法, isOverlap*,比如isOverlap(Date startDate1, Date endDate1, Date startDate2, Date endDate2),重叠返回true。
(26)判断2个或多个时间段是否有重叠(交集)方法, isOverlap*,比如isOverlap(Date startDate1, Date endDate1, Date startDate2, Date endDate2),重叠返回true。

(27)计算平均时间方法,averageTime*,比如averageTime(List<Date> dateList),返回平均时间,比如"15:03:03"。

(28)根据毫秒值计算倒计时方法,countdown*,比如countdown(long millis),返回倒计时,比如"27小时10分钟30秒"。


详细使用可以查看相关测试代码: DateTimeCalculatorUtilTest.
Expand Down Expand Up @@ -256,6 +259,7 @@ cron表达式从左到右(用空格隔开):秒(0-59) 分(0-59) 小
包括功能:
(1)以当前时间为基础分析时间自然语言。
(2)以指定时间为基础分析时间自然语言。
(3)增加多种调用方式,比如parseConcurrent 并发执行,可设置超时时间和自定义线程池等,提高执行效率。

修改自 https://github.com/shinyke/Time-NLP
做了一些修改如下:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import java.util.stream.Collectors;

import com.xkzhangsan.time.TemporalAdjusterExtension;
import com.xkzhangsan.time.constants.XkTimeConstant;
import com.xkzhangsan.time.converter.DateTimeConverterUtil;
import com.xkzhangsan.time.enums.ConstellationNameEnum;
import com.xkzhangsan.time.enums.MonthNameEnum;
Expand Down Expand Up @@ -73,8 +74,9 @@
* 24.修改星期值方法 withDayOfWeek*,比如withDayOfWeek(Date date, long newValue),修改星期为指定值newValue,返回Date<br>
* 25.中国工作日计算(将放假信息包含在内),包括判断当前日期是否为工作日和下一个工作日等方法, isChineseWorkDay*,nextChineseWorkDay*,比如isChineseWorkDay(Date, String holidayData),nextChineseWorkDay(Date date, String holidayData)<br>
* 节假日数据holidayData,如果节假日数据不支持年份,将使用周一到周五为工作日来判断<br>
* 26.判断2个时间段是否有重叠(交集)方法, isOverlap*,比如isOverlap(Date startDate1, Date endDate1, Date startDate2, Date endDate2),重叠返回true。<br>
*
* 26.判断2个或多个时间段是否有重叠(交集)方法, isOverlap*,比如isOverlap(Date startDate1, Date endDate1, Date startDate2, Date endDate2),重叠返回true。<br>
* 27.计算平均时间方法,averageTime*,比如averageTime(List<Date> dateList),返回平均时间,比如"15:03:03"。
* 28.根据毫秒值计算倒计时方法,countdown*,比如countdown(long millis),返回倒计时,比如"27小时10分钟30秒"。
*
* @author xkzhangsan
*
Expand Down Expand Up @@ -3349,6 +3351,37 @@ public static List<LocalDateTime> getLocalDateTimeList(LocalDateTime startInclus
return localDateTimeList;
}

/**
* 获取指定区间的时间列表,包含起始,间隔指定单位的相同时间
* @param startInclusive 开始时间
* @param endInclusive 结束时间
* @param unit 单位
* @return 时间列表
*/
public static List<LocalDateTime> getLocalDateTimeList(LocalDateTime startInclusive, LocalDateTime endInclusive, ChronoUnit unit){
Objects.requireNonNull(startInclusive, "startInclusive");
Objects.requireNonNull(endInclusive, "endInclusive");
Objects.requireNonNull(unit, "unit");
if(startInclusive.isAfter(endInclusive)){
throw new DateTimeException("startInclusive must before or equal endInclusive!");
}

int i = 1;
List<LocalDateTime> localDateTimeList = new ArrayList<LocalDateTime>();
LocalDateTime localDateTime = startInclusive;
localDateTimeList.add(localDateTime);
while(localDateTime.isBefore(endInclusive)){
localDateTime = (LocalDateTime) plus(startInclusive, unit, i);
if(localDateTime.isAfter(endInclusive) || localDateTime.equals(endInclusive)){
break;
}
localDateTimeList.add(localDateTime);
i++;
}
localDateTimeList.add(endInclusive);
return localDateTimeList;
}

/**
* 获取指定区间的时间列表,包含起始
* @param startInclusive 开始时间
Expand All @@ -3373,6 +3406,19 @@ public static List<Date> getDateList(Date startInclusive, Date endInclusive){
.map(localDateTime -> DateTimeConverterUtil.toDate(localDateTime)).collect(Collectors.toList());
}

/**
* 获取指定区间的时间列表,包含起始,间隔指定单位的相同时间
* @param startInclusive 开始时间
* @param endInclusive 结束时间
* @param unit 单位
* @return 时间列表
*/
public static List<Date> getDateList(Date startInclusive, Date endInclusive, ChronoUnit unit){
return getLocalDateTimeList(DateTimeConverterUtil.toLocalDateTime(startInclusive),
DateTimeConverterUtil.toLocalDateTime(endInclusive), unit).stream()
.map(localDateTime -> DateTimeConverterUtil.toDate(localDateTime)).collect(Collectors.toList());
}

/**
* 获取指定年月的所有日期列表
* @param yearMonth 年月
Expand Down Expand Up @@ -4018,5 +4064,60 @@ public static boolean isOverlap(List<TimePair> timePairList, boolean isStrict){
timePairList.toArray(timePairs);
return isOverlap(timePairs, isStrict);
}

/**
* 计算平均时间
* @param dateList 待计算列表
* @return 返回平均时间,LocalTime.toString()可以返回格式化字符串,比如:15:03:03
*/
public static LocalTime averageTime(List<Date> dateList) {
if (CollectionUtil.isEmpty(dateList)) {
throw new DateTimeException("dateList不能为空");
}
double average = dateList.stream().mapToDouble(date -> DateTimeConverterUtil.toLocalTime(date).toNanoOfDay())
.average().getAsDouble();
return LocalTime.ofNanoOfDay(new Double(average).longValue());
}

/**
* 根据毫秒值计算倒计时
* @param millis 相差毫秒值
* @return 返回倒计时,millis <= 0 返回:0小时0分钟0秒
*/
public static String countdown(long millis){
if (millis <= 0) {
return "0小时0分钟0秒";
}
Duration duration = Duration.ofMillis(millis);
long hours = duration.getSeconds() / XkTimeConstant.SECONDS_PER_HOUR;
int minutes = (int) ((duration.getSeconds() % XkTimeConstant.SECONDS_PER_HOUR) / XkTimeConstant.SECONDS_PER_MINUTE);
int seconds = (int) (duration.getSeconds() % XkTimeConstant.SECONDS_PER_MINUTE);
StringBuilder buf = new StringBuilder(24);
buf.append(hours).append("小时");
buf.append(minutes).append("分钟");
buf.append(seconds).append("秒");
return buf.toString();
}

/**
* 根据毫秒值计算倒计时,包含天数
* @param millis 相差毫秒值
* @return 返回倒计时,millis <= 0 返回:0天0小时0分钟0秒
*/
public static String countdownWithDay(long millis){
if (millis <= 0) {
return "0天0小时0分钟0秒";
}
Duration duration = Duration.ofMillis(millis);
long days = duration.getSeconds() / XkTimeConstant.SECONDS_PER_DAY;
int hours = (int) ((duration.getSeconds() % XkTimeConstant.SECONDS_PER_DAY) / XkTimeConstant.SECONDS_PER_HOUR);
int minutes = (int) ((duration.getSeconds() % XkTimeConstant.SECONDS_PER_HOUR) / XkTimeConstant.SECONDS_PER_MINUTE);
int seconds = (int) (duration.getSeconds() % XkTimeConstant.SECONDS_PER_MINUTE);
StringBuilder buf = new StringBuilder(24);
buf.append(days).append("天");
buf.append(hours).append("小时");
buf.append(minutes).append("分钟");
buf.append(seconds).append("秒");
return buf.toString();
}
}
Loading

0 comments on commit 6139c5f

Please sign in to comment.