From 0db031e88b2b6af194f8724efeedaed308c6a52e Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 18 Dec 2019 17:34:32 +0800 Subject: [PATCH] fix DateConvert --- CHANGELOG.md | 1 + .../core/convert/ConverterRegistry.java | 2 +- .../core/convert/impl/DateConverter.java | 15 ++++++--- .../java/cn/hutool/core/date/DateTime.java | 3 ++ .../core/convert/ConvertToSBCAndDBCTest.java | 2 -- .../hutool/core/convert/DateConvertTest.java | 8 +++++ .../cn/hutool/core/date/DateUtilTest.java | 9 ++++++ .../java/cn/hutool/json/JSONConverter.java | 8 ++--- .../main/java/cn/hutool/json/JSONUtil.java | 31 +++++++++---------- .../{Isse644Test.java => Issue644Test.java} | 2 +- .../java/cn/hutool/json/Issue677Test.java | 29 +++++++++++++++++ 11 files changed, 82 insertions(+), 28 deletions(-) rename hutool-json/src/test/java/cn/hutool/json/{Isse644Test.java => Issue644Test.java} (92%) create mode 100644 hutool-json/src/test/java/cn/hutool/json/Issue677Test.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 620cc6c7c..1130c6b6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ * 【db 】 修复SqlExecutor.callQuery关闭Statement导致的问题(issue#I16981@Gitee) * 【db 】 修复XmlUtil.xmlToMap中List节点的问题(pr#82@Gitee) * 【core】 修复ZipUtil中对于/结尾路径处理的问题(issue#I16PKP@Gitee) +* 【core】 修复DateConvert对int不支持导致的问题(issue#677@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java b/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java index d1bc60bca..ced7c3198 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java @@ -216,7 +216,7 @@ public class ConverterRegistry implements Serializable{ if(type instanceof TypeReference) { type = ((TypeReference)type).getType(); } - + // 标准转换器 final Converter converter = getConverter(type, isCustomFirst); if (null != converter) { 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 8becb5e4a..1ee9350c4 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 @@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil; import java.time.temporal.TemporalAccessor; import java.util.Calendar; +import java.util.Date; /** * 日期转换器 @@ -65,19 +66,25 @@ public class DateConverter extends AbstractConverter { if (value instanceof Calendar) { // Handle Calendar mills = ((Calendar) value).getTimeInMillis(); - } else if (value instanceof Long) { - // Handle Long - mills = (Long) value; + } else if (value instanceof Number) { + // Handle Number + mills = ((Number) value).longValue(); }else if (value instanceof TemporalAccessor) { return DateUtil.date((TemporalAccessor) value); } else { // 统一按照字符串处理 final String valueStr = convertToStr(value); + Date date = null; try { - mills = StrUtil.isBlank(this.format) ? DateUtil.parse(valueStr).getTime() : DateUtil.parse(valueStr, this.format).getTime(); + date = StrUtil.isBlank(this.format) // + ? DateUtil.parse(valueStr) // + : DateUtil.parse(valueStr, this.format); } catch (Exception e) { // Ignore Exception } + if(null != date){ + mills = date.getTime(); + } } if (null == mills) { diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java b/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java index 607d5dc4b..b592cc0d4 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java @@ -269,6 +269,7 @@ public class DateTime extends Date { */ public DateTime offset(DateField datePart, int offset) { final Calendar cal = toCalendar(); + //noinspection MagicConstant cal.add(datePart.getValue(), offset); DateTime dt = mutable ? this : ObjectUtil.clone(this); @@ -286,6 +287,7 @@ public class DateTime extends Date { */ public DateTime offsetNew(DateField datePart, int offset) { final Calendar cal = toCalendar(); + //noinspection MagicConstant cal.add(datePart.getValue(), offset); DateTime dt = ObjectUtil.clone(this); @@ -594,6 +596,7 @@ public class DateTime extends Date { locale = Locale.getDefault(Locale.Category.FORMAT); } final Calendar cal = (null != zone) ? Calendar.getInstance(zone, locale) : Calendar.getInstance(locale); + //noinspection MagicConstant cal.setFirstDayOfWeek(firstDayOfWeek.getValue()); cal.setTime(this); return cal; diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToSBCAndDBCTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToSBCAndDBCTest.java index 20cf14d54..204993504 100644 --- a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToSBCAndDBCTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToSBCAndDBCTest.java @@ -3,8 +3,6 @@ package cn.hutool.core.convert; import org.junit.Assert; import org.junit.Test; -import cn.hutool.core.convert.Convert; - /** * 类型转换工具单元测试 * 全角半角转换 diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/DateConvertTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/DateConvertTest.java index bf6134815..4583d77fe 100644 --- a/hutool-core/src/test/java/cn/hutool/core/convert/DateConvertTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/DateConvertTest.java @@ -21,6 +21,14 @@ public class DateConvertTest { Assert.assertEquals(timeLong, value2.getTime()); } + @Test + public void toDateFromIntTest() { + int dateLong = -1497600000; + Date value = Convert.toDate(dateLong); + Assert.assertNotNull(value); + Assert.assertEquals("Mon Dec 15 00:00:00 CST 1969", value.toString()); + } + @Test public void toDateFromLocalDateTimeTest() { LocalDateTime localDateTime = LocalDateTime.parse("2017-05-06T08:30:00", DateTimeFormatter.ISO_DATE_TIME); diff --git a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java index 5078247d9..34f2d2cfc 100644 --- a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java @@ -2,6 +2,7 @@ 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; @@ -624,6 +625,14 @@ public class DateUtilTest { Assert.assertEquals("2017-05-06 08:30:00", date.toString()); } + @Test + public void dateTest2(){ + // 测试负数日期 + long dateLong = -1497600000; + final DateTime date = DateUtil.date(dateLong); + Assert.assertEquals("1969-12-15 00:00:00", date.toString()); + } + @Test public void ageTest(){ String d1 = "2000-02-29"; diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java b/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java index f51623b2d..30bd8e538 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java @@ -1,8 +1,5 @@ package cn.hutool.json; -import java.lang.reflect.Type; -import java.util.List; - import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.ConvertException; import cn.hutool.core.convert.Converter; @@ -14,6 +11,9 @@ import cn.hutool.core.util.TypeUtil; import cn.hutool.json.serialize.GlobalSerializeMapping; import cn.hutool.json.serialize.JSONDeserializer; +import java.lang.reflect.Type; +import java.util.List; + /** * JSON转换器 * @@ -76,7 +76,7 @@ public class JSONConverter implements Converter { return (T) deserializer.deserialize((JSON)value); } } - + Object targetValue; try { targetValue = Convert.convert(targetType, value); diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java index 25a3e5bd6..21d741b83 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java @@ -1,21 +1,5 @@ package cn.hutool.json; -import java.io.File; -import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.lang.reflect.Type; -import java.nio.charset.Charset; -import java.time.LocalDateTime; -import java.time.temporal.TemporalAccessor; -import java.util.Calendar; -import java.util.Collection; -import java.util.Date; -import java.util.Enumeration; -import java.util.List; -import java.util.Map; -import java.util.ResourceBundle; - import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.file.FileReader; import cn.hutool.core.lang.TypeReference; @@ -31,6 +15,21 @@ import cn.hutool.json.serialize.JSONDeserializer; import cn.hutool.json.serialize.JSONObjectSerializer; import cn.hutool.json.serialize.JSONSerializer; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.lang.reflect.Type; +import java.nio.charset.Charset; +import java.time.temporal.TemporalAccessor; +import java.util.Calendar; +import java.util.Collection; +import java.util.Date; +import java.util.Enumeration; +import java.util.List; +import java.util.Map; +import java.util.ResourceBundle; + /** * JSON工具类 * diff --git a/hutool-json/src/test/java/cn/hutool/json/Isse644Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue644Test.java similarity index 92% rename from hutool-json/src/test/java/cn/hutool/json/Isse644Test.java rename to hutool-json/src/test/java/cn/hutool/json/Issue644Test.java index 3b59e410d..5efcf6c9b 100644 --- a/hutool-json/src/test/java/cn/hutool/json/Isse644Test.java +++ b/hutool-json/src/test/java/cn/hutool/json/Issue644Test.java @@ -9,7 +9,7 @@ import java.time.LocalDateTime; /** * 问题反馈对象中有JDK8日期对象时转换失败,5.0.7修复 */ -public class Isse644Test { +public class Issue644Test { @Test public void toBeanTest(){ diff --git a/hutool-json/src/test/java/cn/hutool/json/Issue677Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue677Test.java new file mode 100644 index 000000000..03797fa66 --- /dev/null +++ b/hutool-json/src/test/java/cn/hutool/json/Issue677Test.java @@ -0,0 +1,29 @@ +package cn.hutool.json; + +import cn.hutool.core.date.DateUtil; +import lombok.Data; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Date; + +/** + * 用于测试1970年前的日期(负数)还有int类型的数字转日期可能导致的转换失败问题。 + */ +public class Issue677Test { + + @Test + public void toBeanTest(){ + final AuditResultDto dto = new AuditResultDto(); + dto.setDate(DateUtil.date(-1497600000)); + + final String jsonStr = JSONUtil.toJsonStr(dto); + final AuditResultDto auditResultDto = JSONUtil.toBean(jsonStr, AuditResultDto.class); + Assert.assertEquals("Mon Dec 15 00:00:00 CST 1969", auditResultDto.getDate().toString()); + } + + @Data + public static class AuditResultDto{ + private Date date; + } +}