fix DateConvert

This commit is contained in:
Looly 2019-12-18 17:34:32 +08:00
parent 7ffdc2c473
commit 0db031e88b
11 changed files with 82 additions and 28 deletions

View File

@ -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
-------------------------------------------------------------------------------------------------------------

View File

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

View File

@ -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<java.util.Date> {
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) {

View File

@ -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;

View File

@ -3,8 +3,6 @@ package cn.hutool.core.convert;
import org.junit.Assert;
import org.junit.Test;
import cn.hutool.core.convert.Convert;
/**
* 类型转换工具单元测试
* 全角半角转换

View File

@ -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);

View File

@ -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";

View File

@ -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<JSON> {
return (T) deserializer.deserialize((JSON)value);
}
}
Object targetValue;
try {
targetValue = Convert.convert(targetType, value);

View File

@ -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工具类
*

View File

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

View File

@ -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;
}
}