mirror of
https://gitee.com/dromara/hutool.git
synced 2025-05-06 05:38:00 +08:00
fix time and add test
This commit is contained in:
parent
4b78dba298
commit
105eb4c5ff
@ -6,6 +6,7 @@
|
||||
## 5.0.2
|
||||
|
||||
### 新特性
|
||||
* 【core】 强化java.time包的对象转换支持
|
||||
### Bug修复
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
|
@ -1,10 +1,12 @@
|
||||
package cn.hutool.core.convert.impl;
|
||||
|
||||
import java.time.temporal.TemporalAccessor;
|
||||
import java.util.Calendar;
|
||||
|
||||
import cn.hutool.core.convert.AbstractConverter;
|
||||
import cn.hutool.core.date.DateTime;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.lang.Console;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
|
||||
/**
|
||||
@ -67,6 +69,8 @@ public class DateConverter extends AbstractConverter<java.util.Date> {
|
||||
} else if (value instanceof Long) {
|
||||
// Handle Long
|
||||
mills = (Long) value;
|
||||
}else if (value instanceof TemporalAccessor) {
|
||||
return DateUtil.date((TemporalAccessor) value);
|
||||
} else {
|
||||
// 统一按照字符串处理
|
||||
final String valueStr = convertToStr(value);
|
||||
|
@ -87,9 +87,9 @@ public class TemporalAccessorConverter extends AbstractConverter<TemporalAccesso
|
||||
} else if (value instanceof TemporalAccessor) {
|
||||
return parseFromTemporalAccessor((TemporalAccessor) value);
|
||||
} else if (value instanceof Date) {
|
||||
return parseFromTemporalAccessor(((Date) value).toInstant());
|
||||
return parseFromInstant(((Date) value).toInstant());
|
||||
}else if (value instanceof Calendar) {
|
||||
return parseFromTemporalAccessor(((Calendar) value).toInstant());
|
||||
return parseFromInstant(((Calendar) value).toInstant());
|
||||
} else {
|
||||
return parseFromCharSequence(convertToStr(value));
|
||||
}
|
||||
@ -109,7 +109,7 @@ public class TemporalAccessorConverter extends AbstractConverter<TemporalAccesso
|
||||
} else {
|
||||
instant = DateUtil.parse(value).toInstant();
|
||||
}
|
||||
return parseFromTemporalAccessor(instant);
|
||||
return parseFromInstant(instant);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -119,7 +119,7 @@ public class TemporalAccessorConverter extends AbstractConverter<TemporalAccesso
|
||||
* @return java.time中的对象
|
||||
*/
|
||||
private TemporalAccessor parseFromLong(Long time) {
|
||||
return parseFromTemporalAccessor(Instant.ofEpochMilli(time));
|
||||
return parseFromInstant(Instant.ofEpochMilli(time));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -129,16 +129,85 @@ public class TemporalAccessorConverter extends AbstractConverter<TemporalAccesso
|
||||
* @return java.time中的对象
|
||||
*/
|
||||
private TemporalAccessor parseFromTemporalAccessor(TemporalAccessor temporalAccessor) {
|
||||
return parseFromIntant(Instant.from(temporalAccessor));
|
||||
TemporalAccessor result = null;
|
||||
if(temporalAccessor instanceof LocalDateTime){
|
||||
result = parseFromLocalDateTime((LocalDateTime) temporalAccessor);
|
||||
} else if(temporalAccessor instanceof ZonedDateTime){
|
||||
result = parseFromZonedDateTime((ZonedDateTime) temporalAccessor);
|
||||
}
|
||||
|
||||
if(null == result){
|
||||
result = parseFromInstant(DateUtil.toInstant(temporalAccessor));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将TemporalAccessor型时间戳转换为java.time中的对象
|
||||
*
|
||||
* @param instant TemporalAccessor对象
|
||||
* @param localDateTime {@link LocalDateTime}对象
|
||||
* @return java.time中的对象
|
||||
*/
|
||||
private TemporalAccessor parseFromIntant(Instant instant) {
|
||||
private TemporalAccessor parseFromLocalDateTime(LocalDateTime localDateTime) {
|
||||
if(Instant.class.equals(this.targetType)){
|
||||
return DateUtil.toInstant(localDateTime);
|
||||
}
|
||||
if(LocalDate.class.equals(this.targetType)){
|
||||
return localDateTime.toLocalDate();
|
||||
}
|
||||
if(LocalTime.class.equals(this.targetType)){
|
||||
return localDateTime.toLocalTime();
|
||||
}
|
||||
if(ZonedDateTime.class.equals(this.targetType)){
|
||||
return localDateTime.atZone(ZoneId.systemDefault());
|
||||
}
|
||||
if(OffsetDateTime.class.equals(this.targetType)){
|
||||
return localDateTime.atZone(ZoneId.systemDefault()).toOffsetDateTime();
|
||||
}
|
||||
if(OffsetTime.class.equals(this.targetType)){
|
||||
return localDateTime.atZone(ZoneId.systemDefault()).toOffsetDateTime().toOffsetTime();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将TemporalAccessor型时间戳转换为java.time中的对象
|
||||
*
|
||||
* @param zonedDateTime {@link ZonedDateTime}对象
|
||||
* @return java.time中的对象
|
||||
*/
|
||||
private TemporalAccessor parseFromZonedDateTime(ZonedDateTime zonedDateTime) {
|
||||
if(Instant.class.equals(this.targetType)){
|
||||
return DateUtil.toInstant(zonedDateTime);
|
||||
}
|
||||
if(LocalDateTime.class.equals(this.targetType)){
|
||||
return zonedDateTime.toLocalDateTime();
|
||||
}
|
||||
if(LocalDate.class.equals(this.targetType)){
|
||||
return zonedDateTime.toLocalDate();
|
||||
}
|
||||
if(LocalTime.class.equals(this.targetType)){
|
||||
return zonedDateTime.toLocalTime();
|
||||
}
|
||||
if(OffsetDateTime.class.equals(this.targetType)){
|
||||
return zonedDateTime.toOffsetDateTime();
|
||||
}
|
||||
if(OffsetTime.class.equals(this.targetType)){
|
||||
return zonedDateTime.toOffsetDateTime().toOffsetTime();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将TemporalAccessor型时间戳转换为java.time中的对象
|
||||
*
|
||||
* @param instant {@link Instant}对象
|
||||
* @return java.time中的对象
|
||||
*/
|
||||
private TemporalAccessor parseFromInstant(Instant instant) {
|
||||
if(Instant.class.equals(this.targetType)){
|
||||
return instant;
|
||||
}else if (LocalDateTime.class.equals(this.targetType)) {
|
||||
|
@ -163,7 +163,7 @@ public class DateTime extends Date {
|
||||
* @since 5.0.0
|
||||
*/
|
||||
public DateTime(TemporalAccessor temporalAccessor) {
|
||||
this(Instant.from(temporalAccessor));
|
||||
this(DateUtil.toInstant(temporalAccessor));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -14,6 +14,14 @@ import cn.hutool.core.util.StrUtil;
|
||||
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.LocalTime;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.time.OffsetTime;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.temporal.TemporalAccessor;
|
||||
import java.util.Calendar;
|
||||
@ -194,6 +202,7 @@ public class DateUtil {
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------- Part of Date start
|
||||
|
||||
/**
|
||||
* 获得年的部分
|
||||
*
|
||||
@ -299,7 +308,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 获得指定日期的小时数部分<br>
|
||||
*
|
||||
* @param date 日期
|
||||
* @param date 日期
|
||||
* @param is24HourClock 是否24小时制
|
||||
* @return 小时数
|
||||
*/
|
||||
@ -470,7 +479,7 @@ public class DateUtil {
|
||||
* 获得指定日期区间内的年份和季节<br>
|
||||
*
|
||||
* @param startDate 起始日期(包含)
|
||||
* @param endDate 结束日期(包含)
|
||||
* @param endDate 结束日期(包含)
|
||||
* @return 季度列表 ,元素类似于 20132
|
||||
*/
|
||||
public static LinkedHashSet<String> yearAndQuarter(Date startDate, Date endDate) {
|
||||
@ -484,7 +493,7 @@ public class DateUtil {
|
||||
* 获得指定日期区间内的年份和季节<br>
|
||||
*
|
||||
* @param startDate 起始日期(包含)
|
||||
* @param endDate 结束日期(包含)
|
||||
* @param endDate 结束日期(包含)
|
||||
* @return 季度列表 ,元素类似于 20132
|
||||
* @since 4.1.15
|
||||
*/
|
||||
@ -503,10 +512,11 @@ public class DateUtil {
|
||||
}
|
||||
|
||||
// ------------------------------------ Format start ----------------------------------------------
|
||||
|
||||
/**
|
||||
* 根据特定格式格式化日期
|
||||
*
|
||||
* @param date 被格式化的日期
|
||||
* @param date 被格式化的日期
|
||||
* @param format 日期格式,常用格式见: {@link DatePattern}
|
||||
* @return 格式化后的字符串
|
||||
*/
|
||||
@ -520,7 +530,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 根据特定格式格式化日期
|
||||
*
|
||||
* @param date 被格式化的日期
|
||||
* @param date 被格式化的日期
|
||||
* @param format {@link DatePrinter} 或 {@link FastDateFormat}
|
||||
* @return 格式化后的字符串
|
||||
*/
|
||||
@ -534,7 +544,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 根据特定格式格式化日期
|
||||
*
|
||||
* @param date 被格式化的日期
|
||||
* @param date 被格式化的日期
|
||||
* @param format {@link SimpleDateFormat}
|
||||
* @return 格式化后的字符串
|
||||
*/
|
||||
@ -548,7 +558,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 根据特定格式格式化日期
|
||||
*
|
||||
* @param date 被格式化的日期
|
||||
* @param date 被格式化的日期
|
||||
* @param format {@link SimpleDateFormat}
|
||||
* @return 格式化后的字符串
|
||||
* @since 5.0.0
|
||||
@ -620,7 +630,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 格式化为中文日期格式,如果isUppercase为false,则返回类似:2018年10月24日,否则返回二〇一八年十月二十四日
|
||||
*
|
||||
* @param date 被格式化的日期
|
||||
* @param date 被格式化的日期
|
||||
* @param isUppercase 是否采用大写形式
|
||||
* @return 中文日期字符串
|
||||
* @since 4.1.19
|
||||
@ -653,7 +663,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 构建DateTime对象
|
||||
*
|
||||
* @param dateStr Date字符串
|
||||
* @param dateStr Date字符串
|
||||
* @param dateFormat 格式化器 {@link SimpleDateFormat}
|
||||
* @return DateTime对象
|
||||
*/
|
||||
@ -665,7 +675,7 @@ public class DateUtil {
|
||||
* 构建DateTime对象
|
||||
*
|
||||
* @param dateStr Date字符串
|
||||
* @param parser 格式化器,{@link FastDateFormat}
|
||||
* @param parser 格式化器,{@link FastDateFormat}
|
||||
* @return DateTime对象
|
||||
*/
|
||||
public static DateTime parse(CharSequence dateStr, DateParser parser) {
|
||||
@ -675,7 +685,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 构建DateTime对象
|
||||
*
|
||||
* @param dateStr Date字符串
|
||||
* @param dateStr Date字符串
|
||||
* @param formatter 格式化器,{@link DateTimeFormatter}
|
||||
* @return DateTime对象
|
||||
* @since 5.0.0
|
||||
@ -688,7 +698,7 @@ public class DateUtil {
|
||||
* 将特定格式的日期转换为Date对象
|
||||
*
|
||||
* @param dateStr 特定格式的日期
|
||||
* @param format 格式,例如yyyy-MM-dd
|
||||
* @param format 格式,例如yyyy-MM-dd
|
||||
* @return 日期对象
|
||||
*/
|
||||
public static DateTime parse(CharSequence dateStr, String format) {
|
||||
@ -699,8 +709,8 @@ public class DateUtil {
|
||||
* 将特定格式的日期转换为Date对象
|
||||
*
|
||||
* @param dateStr 特定格式的日期
|
||||
* @param format 格式,例如yyyy-MM-dd
|
||||
* @param locale 区域信息
|
||||
* @param format 格式,例如yyyy-MM-dd
|
||||
* @param locale 区域信息
|
||||
* @return 日期对象
|
||||
* @since 4.5.18
|
||||
*/
|
||||
@ -898,10 +908,11 @@ public class DateUtil {
|
||||
// ------------------------------------ Parse end ----------------------------------------------
|
||||
|
||||
// ------------------------------------ Offset start ----------------------------------------------
|
||||
|
||||
/**
|
||||
* 修改日期为某个时间字段起始时间
|
||||
*
|
||||
* @param date {@link Date}
|
||||
* @param date {@link Date}
|
||||
* @param dateField 时间字段
|
||||
* @return {@link DateTime}
|
||||
* @since 4.5.7
|
||||
@ -913,7 +924,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 修改日期为某个时间字段起始时间
|
||||
*
|
||||
* @param calendar {@link Calendar}
|
||||
* @param calendar {@link Calendar}
|
||||
* @param dateField 时间字段
|
||||
* @return 原{@link Calendar}
|
||||
* @since 4.5.7
|
||||
@ -925,7 +936,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 修改日期为某个时间字段四舍五入时间
|
||||
*
|
||||
* @param date {@link Date}
|
||||
* @param date {@link Date}
|
||||
* @param dateField 时间字段
|
||||
* @return {@link DateTime}
|
||||
* @since 4.5.7
|
||||
@ -937,7 +948,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 修改日期为某个时间字段四舍五入时间
|
||||
*
|
||||
* @param calendar {@link Calendar}
|
||||
* @param calendar {@link Calendar}
|
||||
* @param dateField 时间字段
|
||||
* @return 原{@link Calendar}
|
||||
* @since 4.5.7
|
||||
@ -949,7 +960,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 修改日期为某个时间字段结束时间
|
||||
*
|
||||
* @param date {@link Date}
|
||||
* @param date {@link Date}
|
||||
* @param dateField 时间字段
|
||||
* @return {@link DateTime}
|
||||
* @since 4.5.7
|
||||
@ -961,7 +972,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 修改日期为某个时间字段结束时间
|
||||
*
|
||||
* @param calendar {@link Calendar}
|
||||
* @param calendar {@link Calendar}
|
||||
* @param dateField 时间字段
|
||||
* @return 原{@link Calendar}
|
||||
* @since 4.5.7
|
||||
@ -1087,7 +1098,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 获取给定日期当前周的开始时间
|
||||
*
|
||||
* @param calendar 日期 {@link Calendar}
|
||||
* @param calendar 日期 {@link Calendar}
|
||||
* @param isMondayAsFirstDay 是否周一做为一周的第一天(false表示周日做为第一天)
|
||||
* @return {@link Calendar}
|
||||
* @since 3.1.2
|
||||
@ -1113,7 +1124,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 获取某周的结束时间
|
||||
*
|
||||
* @param calendar 日期 {@link Calendar}
|
||||
* @param calendar 日期 {@link Calendar}
|
||||
* @param isSundayAsLastDay 是否周日做为一周的最后一天(false表示周六做为最后一天)
|
||||
* @return {@link Calendar}
|
||||
* @since 3.1.2
|
||||
@ -1253,6 +1264,7 @@ public class DateUtil {
|
||||
}
|
||||
|
||||
// --------------------------------------------------- Offset for now
|
||||
|
||||
/**
|
||||
* 昨天
|
||||
*
|
||||
@ -1313,7 +1325,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 偏移毫秒数
|
||||
*
|
||||
* @param date 日期
|
||||
* @param date 日期
|
||||
* @param offset 偏移毫秒数,正数向未来偏移,负数向历史偏移
|
||||
* @return 偏移后的日期
|
||||
*/
|
||||
@ -1324,7 +1336,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 偏移秒数
|
||||
*
|
||||
* @param date 日期
|
||||
* @param date 日期
|
||||
* @param offset 偏移秒数,正数向未来偏移,负数向历史偏移
|
||||
* @return 偏移后的日期
|
||||
*/
|
||||
@ -1335,7 +1347,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 偏移分钟
|
||||
*
|
||||
* @param date 日期
|
||||
* @param date 日期
|
||||
* @param offset 偏移分钟数,正数向未来偏移,负数向历史偏移
|
||||
* @return 偏移后的日期
|
||||
*/
|
||||
@ -1346,7 +1358,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 偏移小时
|
||||
*
|
||||
* @param date 日期
|
||||
* @param date 日期
|
||||
* @param offset 偏移小时数,正数向未来偏移,负数向历史偏移
|
||||
* @return 偏移后的日期
|
||||
*/
|
||||
@ -1357,7 +1369,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 偏移天
|
||||
*
|
||||
* @param date 日期
|
||||
* @param date 日期
|
||||
* @param offset 偏移天数,正数向未来偏移,负数向历史偏移
|
||||
* @return 偏移后的日期
|
||||
*/
|
||||
@ -1368,7 +1380,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 偏移周
|
||||
*
|
||||
* @param date 日期
|
||||
* @param date 日期
|
||||
* @param offset 偏移周数,正数向未来偏移,负数向历史偏移
|
||||
* @return 偏移后的日期
|
||||
*/
|
||||
@ -1379,7 +1391,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 偏移月
|
||||
*
|
||||
* @param date 日期
|
||||
* @param date 日期
|
||||
* @param offset 偏移月数,正数向未来偏移,负数向历史偏移
|
||||
* @return 偏移后的日期
|
||||
*/
|
||||
@ -1390,9 +1402,9 @@ public class DateUtil {
|
||||
/**
|
||||
* 获取指定日期偏移指定时间后的时间,生成的偏移日期不影响原日期
|
||||
*
|
||||
* @param date 基准日期
|
||||
* @param date 基准日期
|
||||
* @param dateField 偏移的粒度大小(小时、天、月等){@link DateField}
|
||||
* @param offset 偏移量,正数为向后偏移,负数为向前偏移
|
||||
* @param offset 偏移量,正数为向后偏移,负数为向前偏移
|
||||
* @return 偏移后的日期
|
||||
*/
|
||||
public static DateTime offset(Date date, DateField dateField, int offset) {
|
||||
@ -1402,9 +1414,9 @@ public class DateUtil {
|
||||
/**
|
||||
* 获取指定日期偏移指定时间后的时间
|
||||
*
|
||||
* @param date 基准日期
|
||||
* @param date 基准日期
|
||||
* @param dateField 偏移的粒度大小(小时、天、月等){@link DateField}
|
||||
* @param offset 偏移量,正数为向后偏移,负数为向前偏移
|
||||
* @param offset 偏移量,正数为向后偏移,负数为向前偏移
|
||||
* @return 偏移后的日期
|
||||
* @deprecated please use {@link DateUtil#offset(Date, DateField, int)}
|
||||
*/
|
||||
@ -1418,8 +1430,8 @@ public class DateUtil {
|
||||
* 判断两个日期相差的时长,只保留绝对值
|
||||
*
|
||||
* @param beginDate 起始日期
|
||||
* @param endDate 结束日期
|
||||
* @param unit 相差的单位:相差 天{@link DateUnit#DAY}、小时{@link DateUnit#HOUR} 等
|
||||
* @param endDate 结束日期
|
||||
* @param unit 相差的单位:相差 天{@link DateUnit#DAY}、小时{@link DateUnit#HOUR} 等
|
||||
* @return 日期差
|
||||
*/
|
||||
public static long between(Date beginDate, Date endDate, DateUnit unit) {
|
||||
@ -1430,9 +1442,9 @@ public class DateUtil {
|
||||
* 判断两个日期相差的时长
|
||||
*
|
||||
* @param beginDate 起始日期
|
||||
* @param endDate 结束日期
|
||||
* @param unit 相差的单位:相差 天{@link DateUnit#DAY}、小时{@link DateUnit#HOUR} 等
|
||||
* @param isAbs 日期间隔是否只保留绝对值正数
|
||||
* @param endDate 结束日期
|
||||
* @param unit 相差的单位:相差 天{@link DateUnit#DAY}、小时{@link DateUnit#HOUR} 等
|
||||
* @param isAbs 日期间隔是否只保留绝对值正数
|
||||
* @return 日期差
|
||||
* @since 3.3.1
|
||||
*/
|
||||
@ -1444,7 +1456,7 @@ public class DateUtil {
|
||||
* 判断两个日期相差的毫秒数
|
||||
*
|
||||
* @param beginDate 起始日期
|
||||
* @param endDate 结束日期
|
||||
* @param endDate 结束日期
|
||||
* @return 日期差
|
||||
* @since 3.0.1
|
||||
*/
|
||||
@ -1463,8 +1475,8 @@ public class DateUtil {
|
||||
* </pre>
|
||||
*
|
||||
* @param beginDate 起始日期
|
||||
* @param endDate 结束日期
|
||||
* @param isReset 是否重置时间为起始时间
|
||||
* @param endDate 结束日期
|
||||
* @param isReset 是否重置时间为起始时间
|
||||
* @return 日期差
|
||||
* @since 3.0.1
|
||||
*/
|
||||
@ -1481,8 +1493,8 @@ public class DateUtil {
|
||||
* 在非重置情况下,如果起始日期的天小于结束日期的天,月数要少算1(不足1个月)
|
||||
*
|
||||
* @param beginDate 起始日期
|
||||
* @param endDate 结束日期
|
||||
* @param isReset 是否重置时间为起始时间(重置天时分秒)
|
||||
* @param endDate 结束日期
|
||||
* @param isReset 是否重置时间为起始时间(重置天时分秒)
|
||||
* @return 相差月数
|
||||
* @since 3.0.8
|
||||
*/
|
||||
@ -1495,8 +1507,8 @@ public class DateUtil {
|
||||
* 在非重置情况下,如果起始日期的月小于结束日期的月,年数要少算1(不足1年)
|
||||
*
|
||||
* @param beginDate 起始日期
|
||||
* @param endDate 结束日期
|
||||
* @param isReset 是否重置时间为起始时间(重置月天时分秒)
|
||||
* @param endDate 结束日期
|
||||
* @param isReset 是否重置时间为起始时间(重置月天时分秒)
|
||||
* @return 相差年数
|
||||
* @since 3.0.8
|
||||
*/
|
||||
@ -1508,8 +1520,8 @@ public class DateUtil {
|
||||
* 格式化日期间隔输出
|
||||
*
|
||||
* @param beginDate 起始日期
|
||||
* @param endDate 结束日期
|
||||
* @param level 级别,按照天、小时、分、秒、毫秒分为5个等级
|
||||
* @param endDate 结束日期
|
||||
* @param level 级别,按照天、小时、分、秒、毫秒分为5个等级
|
||||
* @return XX天XX小时XX分XX秒
|
||||
*/
|
||||
public static String formatBetween(Date beginDate, Date endDate, BetweenFormater.Level level) {
|
||||
@ -1520,7 +1532,7 @@ public class DateUtil {
|
||||
* 格式化日期间隔输出,精确到毫秒
|
||||
*
|
||||
* @param beginDate 起始日期
|
||||
* @param endDate 结束日期
|
||||
* @param endDate 结束日期
|
||||
* @return XX天XX小时XX分XX秒
|
||||
* @since 3.0.1
|
||||
*/
|
||||
@ -1532,7 +1544,7 @@ public class DateUtil {
|
||||
* 格式化日期间隔输出
|
||||
*
|
||||
* @param betweenMs 日期间隔
|
||||
* @param level 级别,按照天、小时、分、秒、毫秒分为5个等级
|
||||
* @param level 级别,按照天、小时、分、秒、毫秒分为5个等级
|
||||
* @return XX天XX小时XX分XX秒XX毫秒
|
||||
*/
|
||||
public static String formatBetween(long betweenMs, BetweenFormater.Level level) {
|
||||
@ -1554,9 +1566,9 @@ public class DateUtil {
|
||||
* 当前日期是否在日期指定范围内<br>
|
||||
* 起始日期和结束日期可以互换
|
||||
*
|
||||
* @param date 被检查的日期
|
||||
* @param date 被检查的日期
|
||||
* @param beginDate 起始日期
|
||||
* @param endDate 结束日期
|
||||
* @param endDate 结束日期
|
||||
* @return 是否在范围内
|
||||
* @since 3.0.8
|
||||
*/
|
||||
@ -1646,7 +1658,7 @@ public class DateUtil {
|
||||
* 计算指定指定时间区间内的周数
|
||||
*
|
||||
* @param start 开始时间
|
||||
* @param end 结束时间
|
||||
* @param end 结束时间
|
||||
* @return 周数
|
||||
*/
|
||||
public static int weekCount(Date start, Date end) {
|
||||
@ -1701,7 +1713,7 @@ public class DateUtil {
|
||||
/**
|
||||
* 计算相对于dateToCompare的年龄,长用于计算指定生日在某年的年龄
|
||||
*
|
||||
* @param birthDay 生日
|
||||
* @param birthDay 生日
|
||||
* @param dateToCompare 需要对比的日期
|
||||
* @return 年龄
|
||||
*/
|
||||
@ -1748,9 +1760,9 @@ public class DateUtil {
|
||||
/**
|
||||
* 判定给定开始时间经过某段时间后是否过期
|
||||
*
|
||||
* @param startDate 开始时间
|
||||
* @param dateField 时间单位
|
||||
* @param timeLength 时长
|
||||
* @param startDate 开始时间
|
||||
* @param dateField 时间单位
|
||||
* @param timeLength 时长
|
||||
* @param checkedDate 被比较的时间。如果经过时长后的时间晚于被检查的时间,就表示过期
|
||||
* @return 是否过期
|
||||
* @since 3.1.1
|
||||
@ -1822,8 +1834,8 @@ public class DateUtil {
|
||||
* 创建日期范围生成器
|
||||
*
|
||||
* @param start 起始日期时间
|
||||
* @param end 结束日期时间
|
||||
* @param unit 步进单位
|
||||
* @param end 结束日期时间
|
||||
* @param unit 步进单位
|
||||
* @return {@link DateRange}
|
||||
*/
|
||||
public static DateRange range(Date start, Date end, final DateField unit) {
|
||||
@ -1834,8 +1846,8 @@ public class DateUtil {
|
||||
* 创建日期范围生成器
|
||||
*
|
||||
* @param start 起始日期时间
|
||||
* @param end 结束日期时间
|
||||
* @param unit 步进单位
|
||||
* @param end 结束日期时间
|
||||
* @param unit 步进单位
|
||||
* @return {@link DateRange}
|
||||
*/
|
||||
public static List<DateTime> rangeToList(Date start, Date end, final DateField unit) {
|
||||
@ -1846,7 +1858,7 @@ public class DateUtil {
|
||||
* 通过生日计算星座
|
||||
*
|
||||
* @param month 月,从0开始计数
|
||||
* @param day 天
|
||||
* @param day 天
|
||||
* @return 星座名
|
||||
* @since 4.4.3
|
||||
*/
|
||||
@ -1868,11 +1880,11 @@ public class DateUtil {
|
||||
/**
|
||||
* 获取指定日期字段的最小值,例如分钟的最小值是0
|
||||
*
|
||||
* @param calendar {@link Calendar}
|
||||
* @param calendar {@link Calendar}
|
||||
* @param dateField {@link DateField}
|
||||
* @return 字段最小值
|
||||
* @since 4.5.7
|
||||
* @see Calendar#getActualMinimum(int)
|
||||
* @since 4.5.7
|
||||
*/
|
||||
public static int getBeginValue(Calendar calendar, int dateField) {
|
||||
if (Calendar.DAY_OF_WEEK == dateField) {
|
||||
@ -1884,11 +1896,11 @@ public class DateUtil {
|
||||
/**
|
||||
* 获取指定日期字段的最大值,例如分钟的最大值是59
|
||||
*
|
||||
* @param calendar {@link Calendar}
|
||||
* @param calendar {@link Calendar}
|
||||
* @param dateField {@link DateField}
|
||||
* @return 字段最大值
|
||||
* @since 4.5.7
|
||||
* @see Calendar#getActualMaximum(int)
|
||||
* @since 4.5.7
|
||||
*/
|
||||
public static int getEndValue(Calendar calendar, int dateField) {
|
||||
if (Calendar.DAY_OF_WEEK == dateField) {
|
||||
@ -1943,7 +1955,54 @@ public class DateUtil {
|
||||
return duration / 1_000_000_000.0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Date对象转换为{@link Instant}对象
|
||||
*
|
||||
* @param date Date对象
|
||||
* @return {@link Instant}对象
|
||||
* @since 5.0.2
|
||||
*/
|
||||
public static Instant toInstant(Date date) {
|
||||
return null == date ? null : date.toInstant();
|
||||
}
|
||||
|
||||
/**
|
||||
* Date对象转换为{@link Instant}对象
|
||||
*
|
||||
* @param temporalAccessor Date对象
|
||||
* @return {@link Instant}对象
|
||||
* @since 5.0.2
|
||||
*/
|
||||
public static Instant toInstant(TemporalAccessor temporalAccessor) {
|
||||
if (null == temporalAccessor) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Instant result;
|
||||
if (temporalAccessor instanceof Instant) {
|
||||
result = (Instant) temporalAccessor;
|
||||
} else if (temporalAccessor instanceof LocalDateTime) {
|
||||
result = ((LocalDateTime) temporalAccessor).atZone(ZoneId.systemDefault()).toInstant();
|
||||
} else if (temporalAccessor instanceof ZonedDateTime) {
|
||||
result = ((ZonedDateTime) temporalAccessor).toInstant();
|
||||
} else if (temporalAccessor instanceof OffsetDateTime) {
|
||||
result = ((OffsetDateTime) temporalAccessor).toInstant();
|
||||
} else if (temporalAccessor instanceof LocalDate) {
|
||||
result = ((LocalDate) temporalAccessor).atStartOfDay(ZoneId.systemDefault()).toInstant();
|
||||
} else if (temporalAccessor instanceof LocalTime) {
|
||||
// 指定本地时间转换 为Instant,取当天日期
|
||||
result = ((LocalTime) temporalAccessor).atDate(LocalDate.now()).atZone(ZoneId.systemDefault()).toInstant();
|
||||
} else if (temporalAccessor instanceof OffsetTime) {
|
||||
// 指定本地时间转换 为Instant,取当天日期
|
||||
result = ((OffsetTime) temporalAccessor).atDate(LocalDate.now()).toInstant();
|
||||
} else {
|
||||
result = Instant.from(temporalAccessor);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
// ------------------------------------------------------------------------ Private method start
|
||||
|
||||
/**
|
||||
* 获得指定日期年份和季节<br>
|
||||
* 格式:[20131]表示2013年第一季度
|
||||
@ -1964,13 +2023,13 @@ public class DateUtil {
|
||||
* "年"
|
||||
* "月"
|
||||
* </pre>
|
||||
*
|
||||
* <p>
|
||||
* 将以下字符去除
|
||||
*
|
||||
* <pre>
|
||||
* "日"
|
||||
* </pre>
|
||||
*
|
||||
* <p>
|
||||
* 将以下字符替换为":"
|
||||
*
|
||||
* <pre>
|
||||
@ -1978,7 +2037,7 @@ public class DateUtil {
|
||||
* "分"
|
||||
* "秒"
|
||||
* </pre>
|
||||
*
|
||||
* <p>
|
||||
* 当末位是":"时去除之(不存在毫秒时)
|
||||
*
|
||||
* @param dateStr 日期时间字符串
|
||||
|
@ -140,28 +140,6 @@ public class ConvertTest {
|
||||
Assert.assertNull(number);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void toDateTest() {
|
||||
String a = "2017-05-06";
|
||||
Date value = Convert.toDate(a);
|
||||
Assert.assertEquals(a, DateUtil.formatDate(value));
|
||||
|
||||
long timeLong = DateUtil.date().getTime();
|
||||
Date value2 = Convert.toDate(timeLong);
|
||||
Assert.assertEquals(timeLong, value2.getTime());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void toSqlDateTest() {
|
||||
String a = "2017-05-06";
|
||||
java.sql.Date value = Convert.convert(java.sql.Date.class, a);
|
||||
Assert.assertEquals("2017-05-06", value.toString());
|
||||
|
||||
long timeLong = DateUtil.date().getTime();
|
||||
java.sql.Date value2 = Convert.convert(java.sql.Date.class, timeLong);
|
||||
Assert.assertEquals(timeLong, value2.getTime());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void intAndByteConvertTest() {
|
||||
// 测试 int 转 byte
|
||||
|
@ -0,0 +1,43 @@
|
||||
package cn.hutool.core.convert;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.lang.Console;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Date;
|
||||
|
||||
public class DateConvertTest {
|
||||
|
||||
@Test
|
||||
public void toDateTest() {
|
||||
String a = "2017-05-06";
|
||||
Date value = Convert.toDate(a);
|
||||
Assert.assertEquals(a, DateUtil.formatDate(value));
|
||||
|
||||
long timeLong = DateUtil.date().getTime();
|
||||
Date value2 = Convert.toDate(timeLong);
|
||||
Assert.assertEquals(timeLong, value2.getTime());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void toDateFromLocalDateTimeTest() {
|
||||
LocalDateTime localDateTime = LocalDateTime.parse("2017-05-06T08:30:00", DateTimeFormatter.ISO_DATE_TIME);
|
||||
Date value = Convert.toDate(localDateTime);
|
||||
Assert.assertNotNull(value);
|
||||
Assert.assertEquals("2017-05-06", DateUtil.formatDate(value));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void toSqlDateTest() {
|
||||
String a = "2017-05-06";
|
||||
java.sql.Date value = Convert.convert(java.sql.Date.class, a);
|
||||
Assert.assertEquals("2017-05-06", value.toString());
|
||||
|
||||
long timeLong = DateUtil.date().getTime();
|
||||
java.sql.Date value2 = Convert.convert(java.sql.Date.class, timeLong);
|
||||
Assert.assertEquals(timeLong, value2.getTime());
|
||||
}
|
||||
}
|
@ -2,12 +2,22 @@ package cn.hutool.core.date;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.date.BetweenFormater.Level;
|
||||
import cn.hutool.core.lang.Console;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.LocalTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.TimeZone;
|
||||
|
||||
/**
|
||||
* 时间工具单元测试<br>
|
||||
@ -584,4 +594,26 @@ public class DateUtilTest {
|
||||
String formatHttpDate = DateUtil.formatHttpDate(DateUtil.parse("2019-01-02 22:32:01"));
|
||||
Assert.assertEquals("Wed, 02 Jan 2019 14:32:01 GMT", formatHttpDate);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void toInstantTest(){
|
||||
LocalDateTime localDateTime = LocalDateTime.parse("2017-05-06T08:30:00", DateTimeFormatter.ISO_DATE_TIME);
|
||||
Instant instant = DateUtil.toInstant(localDateTime);
|
||||
Assert.assertEquals("2017-05-06T00:30:00Z", instant.toString());
|
||||
|
||||
LocalDate localDate = localDateTime.toLocalDate();
|
||||
instant = DateUtil.toInstant(localDate);
|
||||
Assert.assertNotNull(instant);
|
||||
|
||||
LocalTime localTime = localDateTime.toLocalTime();
|
||||
instant = DateUtil.toInstant(localTime);
|
||||
Assert.assertNotNull(instant);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void dateTest(){
|
||||
LocalDateTime localDateTime = LocalDateTime.parse("2017-05-06T08:30:00", DateTimeFormatter.ISO_DATE_TIME);
|
||||
DateTime date = DateUtil.date(localDateTime);
|
||||
Assert.assertEquals("2017-05-06 08:30:00", date.toString());
|
||||
}
|
||||
}
|
||||
|
@ -7,6 +7,8 @@ import org.junit.Test;
|
||||
import cn.hutool.core.date.DateTime;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
|
||||
import java.time.ZonedDateTime;
|
||||
|
||||
/**
|
||||
* 身份证单元测试
|
||||
*
|
||||
|
@ -98,12 +98,7 @@ public class Wrapper {
|
||||
|
||||
//对于Oracle这类数据库,表名中包含用户名需要单独拆分包装
|
||||
if(field.contains(StrUtil.DOT)){
|
||||
final Collection<String> target = CollectionUtil.filter(StrUtil.split(field, StrUtil.C_DOT), new Editor<String>(){
|
||||
@Override
|
||||
public String edit(String t) {
|
||||
return StrUtil.format("{}{}{}", preWrapQuote, t, sufWrapQuote);
|
||||
}
|
||||
});
|
||||
final Collection<String> target = CollectionUtil.filter(StrUtil.split(field, StrUtil.C_DOT), (Editor<String>) t -> StrUtil.format("{}{}{}", preWrapQuote, t, sufWrapQuote));
|
||||
return CollectionUtil.join(target, StrUtil.DOT);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user