修复TemporalAccessorConverter自定义格式转换问题

This commit is contained in:
Looly 2024-04-20 16:52:31 +08:00
parent 7a5f910aa7
commit 2b6326ca94
2 changed files with 41 additions and 13 deletions

View File

@ -20,6 +20,7 @@
* 【core 】 解决CalendarUtil.isSameDay时区不同导致结果错误问题pr#3548@Github * 【core 】 解决CalendarUtil.isSameDay时区不同导致结果错误问题pr#3548@Github
* 【core 】 修复RandomUtil.randomStringWithoutStr方法问题pr#1209@Gitee * 【core 】 修复RandomUtil.randomStringWithoutStr方法问题pr#1209@Gitee
* 【http 】 修复HttpRequest.header相同key被覆盖问题issue#I9I61C@Gitee * 【http 】 修复HttpRequest.header相同key被覆盖问题issue#I9I61C@Gitee
* 【core 】 修复TemporalAccessorConverter自定义格式转换问题issue#I9HQQE@Gitee
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------
# 5.8.27(2024-03-29) # 5.8.27(2024-03-29)

View File

@ -117,7 +117,7 @@ public class TemporalAccessorConverter extends AbstractConverter<TemporalAccesso
return LocalDate.of(Convert.toInt(map.get("year")), Convert.toInt(map.get("month")), Convert.toInt(map.get("day"))); return LocalDate.of(Convert.toInt(map.get("year")), Convert.toInt(map.get("month")), Convert.toInt(map.get("day")));
} else if (LocalDateTime.class.equals(this.targetType)) { } else if (LocalDateTime.class.equals(this.targetType)) {
return LocalDateTime.of(Convert.toInt(map.get("year")), Convert.toInt(map.get("month")), Convert.toInt(map.get("day")), return LocalDateTime.of(Convert.toInt(map.get("year")), Convert.toInt(map.get("month")), Convert.toInt(map.get("day")),
Convert.toInt(map.get("hour")), Convert.toInt(map.get("minute")), Convert.toInt(map.get("second")), Convert.toInt(map.get("second"))); Convert.toInt(map.get("hour")), Convert.toInt(map.get("minute")), Convert.toInt(map.get("second")), Convert.toInt(map.get("second")));
} else if (LocalTime.class.equals(this.targetType)) { } else if (LocalTime.class.equals(this.targetType)) {
return LocalTime.of(Convert.toInt(map.get("hour")), Convert.toInt(map.get("minute")), Convert.toInt(map.get("second")), Convert.toInt(map.get("nano"))); return LocalTime.of(Convert.toInt(map.get("hour")), Convert.toInt(map.get("minute")), Convert.toInt(map.get("second")), Convert.toInt(map.get("nano")));
} }
@ -138,13 +138,13 @@ public class TemporalAccessorConverter extends AbstractConverter<TemporalAccesso
return null; return null;
} }
if(DayOfWeek.class.equals(this.targetType)){ if (DayOfWeek.class.equals(this.targetType)) {
return DayOfWeek.valueOf(StrUtil.toString(value)); return DayOfWeek.valueOf(StrUtil.toString(value));
} else if(Month.class.equals(this.targetType)){ } else if (Month.class.equals(this.targetType)) {
return Month.valueOf(StrUtil.toString(value)); return Month.valueOf(StrUtil.toString(value));
} else if(Era.class.equals(this.targetType)){ } else if (Era.class.equals(this.targetType)) {
return IsoEra.valueOf(StrUtil.toString(value)); return IsoEra.valueOf(StrUtil.toString(value));
} else if(MonthDay.class.equals(this.targetType)){ } else if (MonthDay.class.equals(this.targetType)) {
return MonthDay.parse(value); return MonthDay.parse(value);
} }
@ -152,6 +152,13 @@ public class TemporalAccessorConverter extends AbstractConverter<TemporalAccesso
ZoneId zoneId; ZoneId zoneId;
if (null != this.format) { if (null != this.format) {
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern(this.format); final DateTimeFormatter formatter = DateTimeFormatter.ofPattern(this.format);
// issue#I9HQQE
final TemporalAccessor temporalAccessor = parseWithFormat(this.targetType, value, formatter);
if (null != temporalAccessor) {
return temporalAccessor;
}
instant = formatter.parse(value, Instant::from); instant = formatter.parse(value, Instant::from);
zoneId = formatter.getZone(); zoneId = formatter.getZone();
} else { } else {
@ -162,6 +169,26 @@ public class TemporalAccessorConverter extends AbstractConverter<TemporalAccesso
return parseFromInstant(instant, zoneId); return parseFromInstant(instant, zoneId);
} }
/**
* 对于自定义格式的字符串单独解析为{@link TemporalAccessor}
*
* @param targetClass 目标类型
* @param value 日期字符串
* @param formatter 格式
* @return {@link TemporalAccessor}
*/
private TemporalAccessor parseWithFormat(final Class<?> targetClass, final CharSequence value, final DateTimeFormatter formatter) {
// issue#I9HQQE
if (LocalDate.class == targetClass) {
return LocalDate.parse(value, formatter);
} else if (LocalDateTime.class == targetClass) {
return LocalDateTime.parse(value, formatter);
} else if (LocalTime.class == targetClass) {
return LocalTime.parse(value, formatter);
}
return null;
}
/** /**
* 将Long型时间戳转换为java.time中的对象 * 将Long型时间戳转换为java.time中的对象
* *
@ -169,20 +196,20 @@ public class TemporalAccessorConverter extends AbstractConverter<TemporalAccesso
* @return java.time中的对象 * @return java.time中的对象
*/ */
private TemporalAccessor parseFromLong(Long time) { private TemporalAccessor parseFromLong(Long time) {
if(DayOfWeek.class.equals(this.targetType)){ if (DayOfWeek.class.equals(this.targetType)) {
return DayOfWeek.of(Math.toIntExact(time)); return DayOfWeek.of(Math.toIntExact(time));
} else if(Month.class.equals(this.targetType)){ } else if (Month.class.equals(this.targetType)) {
return Month.of(Math.toIntExact(time)); return Month.of(Math.toIntExact(time));
} else if(Era.class.equals(this.targetType)){ } else if (Era.class.equals(this.targetType)) {
return IsoEra.of(Math.toIntExact(time)); return IsoEra.of(Math.toIntExact(time));
} }
final Instant instant; final Instant instant;
if(GlobalCustomFormat.FORMAT_SECONDS.equals(this.format)){ if (GlobalCustomFormat.FORMAT_SECONDS.equals(this.format)) {
// https://gitee.com/dromara/hutool/issues/I6IS5B // https://gitee.com/dromara/hutool/issues/I6IS5B
// Unix时间戳 // Unix时间戳
instant = Instant.ofEpochSecond(time); instant = Instant.ofEpochSecond(time);
}else{ } else {
instant = Instant.ofEpochMilli(time); instant = Instant.ofEpochMilli(time);
} }
return parseFromInstant(instant, null); return parseFromInstant(instant, null);
@ -195,11 +222,11 @@ public class TemporalAccessorConverter extends AbstractConverter<TemporalAccesso
* @return java.time中的对象 * @return java.time中的对象
*/ */
private TemporalAccessor parseFromTemporalAccessor(TemporalAccessor temporalAccessor) { private TemporalAccessor parseFromTemporalAccessor(TemporalAccessor temporalAccessor) {
if(DayOfWeek.class.equals(this.targetType)){ if (DayOfWeek.class.equals(this.targetType)) {
return DayOfWeek.from(temporalAccessor); return DayOfWeek.from(temporalAccessor);
} else if(Month.class.equals(this.targetType)){ } else if (Month.class.equals(this.targetType)) {
return Month.from(temporalAccessor); return Month.from(temporalAccessor);
} else if(MonthDay.class.equals(this.targetType)){ } else if (MonthDay.class.equals(this.targetType)) {
return MonthDay.from(temporalAccessor); return MonthDay.from(temporalAccessor);
} }