Browse Source

fix DateConvert

Looly 6 years ago
parent
commit
0db031e88b

+ 1 - 0
CHANGELOG.md

@@ -18,6 +18,7 @@
 * 【db  】      修复SqlExecutor.callQuery关闭Statement导致的问题(issue#I16981@Gitee)
 * 【db  】      修复SqlExecutor.callQuery关闭Statement导致的问题(issue#I16981@Gitee)
 * 【db  】      修复XmlUtil.xmlToMap中List节点的问题(pr#82@Gitee)
 * 【db  】      修复XmlUtil.xmlToMap中List节点的问题(pr#82@Gitee)
 * 【core】      修复ZipUtil中对于/结尾路径处理的问题(issue#I16PKP@Gitee)
 * 【core】      修复ZipUtil中对于/结尾路径处理的问题(issue#I16PKP@Gitee)
+* 【core】      修复DateConvert对int不支持导致的问题(issue#677@Github)
 
 
 -------------------------------------------------------------------------------------------------------------
 -------------------------------------------------------------------------------------------------------------
 
 

+ 1 - 1
hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java

@@ -216,7 +216,7 @@ public class ConverterRegistry implements Serializable{
 		if(type instanceof TypeReference) {
 		if(type instanceof TypeReference) {
 			type = ((TypeReference<?>)type).getType();
 			type = ((TypeReference<?>)type).getType();
 		}
 		}
-		
+
 		// 标准转换器
 		// 标准转换器
 		final Converter<T> converter = getConverter(type, isCustomFirst);
 		final Converter<T> converter = getConverter(type, isCustomFirst);
 		if (null != converter) {
 		if (null != converter) {

+ 11 - 4
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.time.temporal.TemporalAccessor;
 import java.util.Calendar;
 import java.util.Calendar;
+import java.util.Date;
 
 
 /**
 /**
  * 日期转换器
  * 日期转换器
@@ -65,19 +66,25 @@ public class DateConverter extends AbstractConverter<java.util.Date> {
 		if (value instanceof Calendar) {
 		if (value instanceof Calendar) {
 			// Handle Calendar
 			// Handle Calendar
 			mills = ((Calendar) value).getTimeInMillis();
 			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) {
 		}else if (value instanceof TemporalAccessor) {
 			return DateUtil.date((TemporalAccessor) value);
 			return DateUtil.date((TemporalAccessor) value);
 		} else {
 		} else {
 			// 统一按照字符串处理
 			// 统一按照字符串处理
 			final String valueStr = convertToStr(value);
 			final String valueStr = convertToStr(value);
+			Date date = null;
 			try {
 			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) {
 			} catch (Exception e) {
 				// Ignore Exception
 				// Ignore Exception
 			}
 			}
+			if(null != date){
+				mills = date.getTime();
+			}
 		}
 		}
 
 
 		if (null == mills) {
 		if (null == mills) {

+ 3 - 0
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) {
 	public DateTime offset(DateField datePart, int offset) {
 		final Calendar cal = toCalendar();
 		final Calendar cal = toCalendar();
+		//noinspection MagicConstant
 		cal.add(datePart.getValue(), offset);
 		cal.add(datePart.getValue(), offset);
 
 
 		DateTime dt = mutable ? this : ObjectUtil.clone(this);
 		DateTime dt = mutable ? this : ObjectUtil.clone(this);
@@ -286,6 +287,7 @@ public class DateTime extends Date {
 	 */
 	 */
 	public DateTime offsetNew(DateField datePart, int offset) {
 	public DateTime offsetNew(DateField datePart, int offset) {
 		final Calendar cal = toCalendar();
 		final Calendar cal = toCalendar();
+		//noinspection MagicConstant
 		cal.add(datePart.getValue(), offset);
 		cal.add(datePart.getValue(), offset);
 
 
 		DateTime dt = ObjectUtil.clone(this);
 		DateTime dt = ObjectUtil.clone(this);
@@ -594,6 +596,7 @@ public class DateTime extends Date {
 			locale = Locale.getDefault(Locale.Category.FORMAT);
 			locale = Locale.getDefault(Locale.Category.FORMAT);
 		}
 		}
 		final Calendar cal = (null != zone) ? Calendar.getInstance(zone, locale) : Calendar.getInstance(locale);
 		final Calendar cal = (null != zone) ? Calendar.getInstance(zone, locale) : Calendar.getInstance(locale);
+		//noinspection MagicConstant
 		cal.setFirstDayOfWeek(firstDayOfWeek.getValue());
 		cal.setFirstDayOfWeek(firstDayOfWeek.getValue());
 		cal.setTime(this);
 		cal.setTime(this);
 		return cal;
 		return cal;

+ 0 - 2
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.Assert;
 import org.junit.Test;
 import org.junit.Test;
 
 
-import cn.hutool.core.convert.Convert;
-
 /**
 /**
  * 类型转换工具单元测试
  * 类型转换工具单元测试
  * 全角半角转换
  * 全角半角转换

+ 8 - 0
hutool-core/src/test/java/cn/hutool/core/convert/DateConvertTest.java

@@ -22,6 +22,14 @@ public class DateConvertTest {
 	}
 	}
 
 
 	@Test
 	@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() {
 	public void toDateFromLocalDateTimeTest() {
 		LocalDateTime localDateTime = LocalDateTime.parse("2017-05-06T08:30:00", DateTimeFormatter.ISO_DATE_TIME);
 		LocalDateTime localDateTime = LocalDateTime.parse("2017-05-06T08:30:00", DateTimeFormatter.ISO_DATE_TIME);
 		Date value = Convert.toDate(localDateTime);
 		Date value = Convert.toDate(localDateTime);

+ 9 - 0
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.collection.CollUtil;
 import cn.hutool.core.date.BetweenFormater.Level;
 import cn.hutool.core.date.BetweenFormater.Level;
+import cn.hutool.core.lang.Console;
 import org.junit.Assert;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.Test;
 
 
@@ -625,6 +626,14 @@ public class DateUtilTest {
 	}
 	}
 
 
 	@Test
 	@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(){
 	public void ageTest(){
 		String d1 = "2000-02-29";
 		String d1 = "2000-02-29";
 		String d2 = "2018-02-28";
 		String d2 = "2018-02-28";

+ 4 - 4
hutool-json/src/main/java/cn/hutool/json/JSONConverter.java

@@ -1,8 +1,5 @@
 package cn.hutool.json;
 package cn.hutool.json;
 
 
-import java.lang.reflect.Type;
-import java.util.List;
-
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.convert.ConvertException;
 import cn.hutool.core.convert.ConvertException;
 import cn.hutool.core.convert.Converter;
 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.GlobalSerializeMapping;
 import cn.hutool.json.serialize.JSONDeserializer;
 import cn.hutool.json.serialize.JSONDeserializer;
 
 
+import java.lang.reflect.Type;
+import java.util.List;
+
 /**
 /**
  * JSON转换器
  * JSON转换器
  * 
  * 
@@ -76,7 +76,7 @@ public class JSONConverter implements Converter<JSON> {
 				return (T) deserializer.deserialize((JSON)value);
 				return (T) deserializer.deserialize((JSON)value);
 			}
 			}
 		}
 		}
-		
+
 		Object targetValue;
 		Object targetValue;
 		try {
 		try {
 			targetValue = Convert.convert(targetType, value);
 			targetValue = Convert.convert(targetType, value);

+ 15 - 16
hutool-json/src/main/java/cn/hutool/json/JSONUtil.java

@@ -1,21 +1,5 @@
 package cn.hutool.json;
 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.IORuntimeException;
 import cn.hutool.core.io.file.FileReader;
 import cn.hutool.core.io.file.FileReader;
 import cn.hutool.core.lang.TypeReference;
 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.JSONObjectSerializer;
 import cn.hutool.json.serialize.JSONSerializer;
 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工具类
  * JSON工具类
  *
  *

+ 1 - 1
hutool-json/src/test/java/cn/hutool/json/Isse644Test.java

@@ -9,7 +9,7 @@ import java.time.LocalDateTime;
 /**
 /**
  * 问题反馈对象中有JDK8日期对象时转换失败,5.0.7修复
  * 问题反馈对象中有JDK8日期对象时转换失败,5.0.7修复
  */
  */
-public class Isse644Test {
+public class Issue644Test {
 
 
 	@Test
 	@Test
 	public void toBeanTest(){
 	public void toBeanTest(){

+ 29 - 0
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;
+	}
+}