fix time and add test

This commit is contained in:
Looly 2019-10-18 10:41:52 +08:00
parent 4b78dba298
commit 105eb4c5ff
10 changed files with 430 additions and 247 deletions

View File

@ -6,6 +6,7 @@
## 5.0.2
### 新特性
* 【core】 强化java.time包的对象转换支持
### Bug修复
-------------------------------------------------------------------------------------------------------------

View File

@ -1,10 +1,12 @@
package cn.hutool.core.convert.impl;
import java.time.temporal.TemporalAccessor;
import java.util.Calendar;
import cn.hutool.core.convert.AbstractConverter;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.StrUtil;
/**
@ -67,6 +69,8 @@ public class DateConverter extends AbstractConverter<java.util.Date> {
} else if (value instanceof Long) {
// Handle Long
mills = (Long) value;
}else if (value instanceof TemporalAccessor) {
return DateUtil.date((TemporalAccessor) value);
} else {
// 统一按照字符串处理
final String valueStr = convertToStr(value);

View File

@ -87,9 +87,9 @@ public class TemporalAccessorConverter extends AbstractConverter<TemporalAccesso
} else if (value instanceof TemporalAccessor) {
return parseFromTemporalAccessor((TemporalAccessor) value);
} else if (value instanceof Date) {
return parseFromTemporalAccessor(((Date) value).toInstant());
return parseFromInstant(((Date) value).toInstant());
}else if (value instanceof Calendar) {
return parseFromTemporalAccessor(((Calendar) value).toInstant());
return parseFromInstant(((Calendar) value).toInstant());
} else {
return parseFromCharSequence(convertToStr(value));
}
@ -109,7 +109,7 @@ public class TemporalAccessorConverter extends AbstractConverter<TemporalAccesso
} else {
instant = DateUtil.parse(value).toInstant();
}
return parseFromTemporalAccessor(instant);
return parseFromInstant(instant);
}
/**
@ -119,7 +119,7 @@ public class TemporalAccessorConverter extends AbstractConverter<TemporalAccesso
* @return java.time中的对象
*/
private TemporalAccessor parseFromLong(Long time) {
return parseFromTemporalAccessor(Instant.ofEpochMilli(time));
return parseFromInstant(Instant.ofEpochMilli(time));
}
/**
@ -129,16 +129,85 @@ public class TemporalAccessorConverter extends AbstractConverter<TemporalAccesso
* @return java.time中的对象
*/
private TemporalAccessor parseFromTemporalAccessor(TemporalAccessor temporalAccessor) {
return parseFromIntant(Instant.from(temporalAccessor));
TemporalAccessor result = null;
if(temporalAccessor instanceof LocalDateTime){
result = parseFromLocalDateTime((LocalDateTime) temporalAccessor);
} else if(temporalAccessor instanceof ZonedDateTime){
result = parseFromZonedDateTime((ZonedDateTime) temporalAccessor);
}
if(null == result){
result = parseFromInstant(DateUtil.toInstant(temporalAccessor));
}
return result;
}
/**
* 将TemporalAccessor型时间戳转换为java.time中的对象
*
* @param instant TemporalAccessor对象
* @param localDateTime {@link LocalDateTime}对象
* @return java.time中的对象
*/
private TemporalAccessor parseFromIntant(Instant instant) {
private TemporalAccessor parseFromLocalDateTime(LocalDateTime localDateTime) {
if(Instant.class.equals(this.targetType)){
return DateUtil.toInstant(localDateTime);
}
if(LocalDate.class.equals(this.targetType)){
return localDateTime.toLocalDate();
}
if(LocalTime.class.equals(this.targetType)){
return localDateTime.toLocalTime();
}
if(ZonedDateTime.class.equals(this.targetType)){
return localDateTime.atZone(ZoneId.systemDefault());
}
if(OffsetDateTime.class.equals(this.targetType)){
return localDateTime.atZone(ZoneId.systemDefault()).toOffsetDateTime();
}
if(OffsetTime.class.equals(this.targetType)){
return localDateTime.atZone(ZoneId.systemDefault()).toOffsetDateTime().toOffsetTime();
}
return null;
}
/**
* 将TemporalAccessor型时间戳转换为java.time中的对象
*
* @param zonedDateTime {@link ZonedDateTime}对象
* @return java.time中的对象
*/
private TemporalAccessor parseFromZonedDateTime(ZonedDateTime zonedDateTime) {
if(Instant.class.equals(this.targetType)){
return DateUtil.toInstant(zonedDateTime);
}
if(LocalDateTime.class.equals(this.targetType)){
return zonedDateTime.toLocalDateTime();
}
if(LocalDate.class.equals(this.targetType)){
return zonedDateTime.toLocalDate();
}
if(LocalTime.class.equals(this.targetType)){
return zonedDateTime.toLocalTime();
}
if(OffsetDateTime.class.equals(this.targetType)){
return zonedDateTime.toOffsetDateTime();
}
if(OffsetTime.class.equals(this.targetType)){
return zonedDateTime.toOffsetDateTime().toOffsetTime();
}
return null;
}
/**
* 将TemporalAccessor型时间戳转换为java.time中的对象
*
* @param instant {@link Instant}对象
* @return java.time中的对象
*/
private TemporalAccessor parseFromInstant(Instant instant) {
if(Instant.class.equals(this.targetType)){
return instant;
}else if (LocalDateTime.class.equals(this.targetType)) {

View File

@ -163,7 +163,7 @@ public class DateTime extends Date {
* @since 5.0.0
*/
public DateTime(TemporalAccessor temporalAccessor) {
this(Instant.from(temporalAccessor));
this(DateUtil.toInstant(temporalAccessor));
}
/**

File diff suppressed because it is too large Load Diff

View File

@ -140,28 +140,6 @@ public class ConvertTest {
Assert.assertNull(number);
}
@Test
public void toDateTest() {
String a = "2017-05-06";
Date value = Convert.toDate(a);
Assert.assertEquals(a, DateUtil.formatDate(value));
long timeLong = DateUtil.date().getTime();
Date value2 = Convert.toDate(timeLong);
Assert.assertEquals(timeLong, value2.getTime());
}
@Test
public void toSqlDateTest() {
String a = "2017-05-06";
java.sql.Date value = Convert.convert(java.sql.Date.class, a);
Assert.assertEquals("2017-05-06", value.toString());
long timeLong = DateUtil.date().getTime();
java.sql.Date value2 = Convert.convert(java.sql.Date.class, timeLong);
Assert.assertEquals(timeLong, value2.getTime());
}
@Test
public void intAndByteConvertTest() {
// 测试 int byte

View File

@ -0,0 +1,43 @@
package cn.hutool.core.convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Console;
import org.junit.Assert;
import org.junit.Test;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
public class DateConvertTest {
@Test
public void toDateTest() {
String a = "2017-05-06";
Date value = Convert.toDate(a);
Assert.assertEquals(a, DateUtil.formatDate(value));
long timeLong = DateUtil.date().getTime();
Date value2 = Convert.toDate(timeLong);
Assert.assertEquals(timeLong, value2.getTime());
}
@Test
public void toDateFromLocalDateTimeTest() {
LocalDateTime localDateTime = LocalDateTime.parse("2017-05-06T08:30:00", DateTimeFormatter.ISO_DATE_TIME);
Date value = Convert.toDate(localDateTime);
Assert.assertNotNull(value);
Assert.assertEquals("2017-05-06", DateUtil.formatDate(value));
}
@Test
public void toSqlDateTest() {
String a = "2017-05-06";
java.sql.Date value = Convert.convert(java.sql.Date.class, a);
Assert.assertEquals("2017-05-06", value.toString());
long timeLong = DateUtil.date().getTime();
java.sql.Date value2 = Convert.convert(java.sql.Date.class, timeLong);
Assert.assertEquals(timeLong, value2.getTime());
}
}

View File

@ -2,12 +2,22 @@ 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;
import java.text.SimpleDateFormat;
import java.util.*;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.TimeZone;
/**
* 时间工具单元测试<br>
@ -584,4 +594,26 @@ public class DateUtilTest {
String formatHttpDate = DateUtil.formatHttpDate(DateUtil.parse("2019-01-02 22:32:01"));
Assert.assertEquals("Wed, 02 Jan 2019 14:32:01 GMT", formatHttpDate);
}
@Test
public void toInstantTest(){
LocalDateTime localDateTime = LocalDateTime.parse("2017-05-06T08:30:00", DateTimeFormatter.ISO_DATE_TIME);
Instant instant = DateUtil.toInstant(localDateTime);
Assert.assertEquals("2017-05-06T00:30:00Z", instant.toString());
LocalDate localDate = localDateTime.toLocalDate();
instant = DateUtil.toInstant(localDate);
Assert.assertNotNull(instant);
LocalTime localTime = localDateTime.toLocalTime();
instant = DateUtil.toInstant(localTime);
Assert.assertNotNull(instant);
}
@Test
public void dateTest(){
LocalDateTime localDateTime = LocalDateTime.parse("2017-05-06T08:30:00", DateTimeFormatter.ISO_DATE_TIME);
DateTime date = DateUtil.date(localDateTime);
Assert.assertEquals("2017-05-06 08:30:00", date.toString());
}
}

View File

@ -7,6 +7,8 @@ import org.junit.Test;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import java.time.ZonedDateTime;
/**
* 身份证单元测试
*

View File

@ -98,12 +98,7 @@ public class Wrapper {
//对于Oracle这类数据库表名中包含用户名需要单独拆分包装
if(field.contains(StrUtil.DOT)){
final Collection<String> target = CollectionUtil.filter(StrUtil.split(field, StrUtil.C_DOT), new Editor<String>(){
@Override
public String edit(String t) {
return StrUtil.format("{}{}{}", preWrapQuote, t, sufWrapQuote);
}
});
final Collection<String> target = CollectionUtil.filter(StrUtil.split(field, StrUtil.C_DOT), (Editor<String>) t -> StrUtil.format("{}{}{}", preWrapQuote, t, sufWrapQuote));
return CollectionUtil.join(target, StrUtil.DOT);
}