diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c49281cf..2ee25e96c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ * 【core 】 SimpleCache缓存降低锁的粒度,提高并发能力(pr#1385@Github) * 【core 】 增加RadixUtil(pr#260@Gitee) * 【core 】 BeanUtil.getFieldValue支持获取字段集合(pr#254@Gitee) +* 【core 】 DateConvert转换失败默认抛出异常(issue#I2M5GN@Gitee) ### Bug修复 * 【core 】 修复FileUtil.move以及PathUtil.copy等无法自动创建父目录的问题(issue#I2CKTI@Gitee) diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java index 440ac4b4f..a936c6e76 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java @@ -11,7 +11,7 @@ import java.util.Date; /** * 日期转换器 - * + * * @author Looly * */ @@ -24,7 +24,7 @@ public class DateConverter extends AbstractConverter { /** * 构造 - * + * * @param targetType 目标类型 */ public DateConverter(Class targetType) { @@ -33,7 +33,7 @@ public class DateConverter extends AbstractConverter { /** * 构造 - * + * * @param targetType 目标类型 * @param format 日期格式 */ @@ -44,7 +44,7 @@ public class DateConverter extends AbstractConverter { /** * 获取日期格式 - * + * * @return 设置日期格式 */ public String getFormat() { @@ -53,7 +53,7 @@ public class DateConverter extends AbstractConverter { /** * 设置日期格式 - * + * * @param format 日期格式 */ public void setFormat(String format) { @@ -62,50 +62,75 @@ public class DateConverter extends AbstractConverter { @Override protected java.util.Date convertInternal(Object value) { - Long mills = null; - if (value instanceof Calendar) { - // Handle Calendar - mills = ((Calendar) value).getTimeInMillis(); + if (value instanceof TemporalAccessor) { + return wrap(DateUtil.date((TemporalAccessor) value)); + } else if (value instanceof Calendar) { + return wrap(DateUtil.date((Calendar) value)); } else if (value instanceof Number) { - // Handle Number - mills = ((Number) value).longValue(); - }else if (value instanceof TemporalAccessor) { - return DateUtil.date((TemporalAccessor) value); + return wrap(((Number) value).longValue()); } else { // 统一按照字符串处理 final String valueStr = convertToStr(value); - Date date = null; - try { - date = StrUtil.isBlank(this.format) // - ? DateUtil.parse(valueStr) // - : DateUtil.parse(valueStr, this.format); - } catch (Exception e) { - // Ignore Exception - } + final Date date = StrUtil.isBlank(this.format) // + ? DateUtil.parse(valueStr) // + : DateUtil.parse(valueStr, this.format); if(null != date){ - mills = date.getTime(); + return wrap(date); } } - if (null == mills) { - return null; - } - - // 返回指定类型 - if (java.util.Date.class == targetType) { - return new java.util.Date(mills); - } - if (DateTime.class == targetType) { - return new DateTime(mills); - } else if (java.sql.Date.class == targetType) { - return new java.sql.Date(mills); - } else if (java.sql.Time.class == targetType) { - return new java.sql.Time(mills); - } else if (java.sql.Timestamp.class == targetType) { - return new java.sql.Timestamp(mills); - } - throw new UnsupportedOperationException(StrUtil.format("Unsupport Date type: {}", this.targetType.getName())); } + /** + * java.util.Date转为子类型 + * @param date Date + * @return 目标类型对象 + */ + private java.util.Date wrap(java.util.Date date){ + // 返回指定类型 + if (java.util.Date.class == targetType) { + return date; + } + if (DateTime.class == targetType) { + return DateUtil.date(date); + } + if (java.sql.Date.class == targetType) { + return new java.sql.Date(date.getTime()); + } + if (java.sql.Time.class == targetType) { + return new java.sql.Time(date.getTime()); + } + if (java.sql.Timestamp.class == targetType) { + return new java.sql.Timestamp(date.getTime()); + } + + throw new UnsupportedOperationException(StrUtil.format("Unsupport Date type: {}", this.targetType.getName())); + } + + /** + * java.util.Date转为子类型 + * @param mills Date + * @return 目标类型对象 + */ + private java.util.Date wrap(long mills){ + // 返回指定类型 + if (java.util.Date.class == targetType) { + return new Date(mills); + } + if (DateTime.class == targetType) { + return DateUtil.date(mills); + } + if (java.sql.Date.class == targetType) { + return new java.sql.Date(mills); + } + if (java.sql.Time.class == targetType) { + return new java.sql.Time(mills); + } + if (java.sql.Timestamp.class == targetType) { + return new java.sql.Timestamp(mills); + } + + throw new UnsupportedOperationException(StrUtil.format("Unsupport Date type: {}", this.targetType.getName())); + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java index b24bb5f1d..9b1f042a0 100644 --- a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java @@ -1,6 +1,7 @@ package cn.hutool.core.convert; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateException; import cn.hutool.core.lang.TypeReference; import lombok.AllArgsConstructor; import lombok.Data; @@ -11,6 +12,7 @@ import org.junit.Test; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.List; import java.util.Set; import java.util.concurrent.atomic.AtomicIntegerArray; @@ -245,7 +247,7 @@ public class ConvertTest { @Test public void toClassTest(){ final Class convert = Convert.convert(Class.class, "cn.hutool.core.convert.ConvertTest.Product"); - Assert.assertEquals(Product.class, convert); + Assert.assertSame(Product.class, convert); } @Data @@ -288,4 +290,10 @@ public class ConvertTest { this.name = name; } } + + @Test(expected = DateException.class) + public void toDateTest(){ + // 默认转换失败报错而不是返回null + Convert.convert(Date.class, "aaaa"); + } }