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));
}
/**

View File

@ -14,6 +14,14 @@ import cn.hutool.core.util.StrUtil;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.OffsetTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;
import java.util.Calendar;
@ -194,6 +202,7 @@ public class DateUtil {
}
// -------------------------------------------------------------- Part of Date start
/**
* 获得年的部分
*
@ -503,6 +512,7 @@ public class DateUtil {
}
// ------------------------------------ Format start ----------------------------------------------
/**
* 根据特定格式格式化日期
*
@ -898,6 +908,7 @@ public class DateUtil {
// ------------------------------------ Parse end ----------------------------------------------
// ------------------------------------ Offset start ----------------------------------------------
/**
* 修改日期为某个时间字段起始时间
*
@ -1253,6 +1264,7 @@ public class DateUtil {
}
// --------------------------------------------------- Offset for now
/**
* 昨天
*
@ -1871,8 +1883,8 @@ public class DateUtil {
* @param calendar {@link Calendar}
* @param dateField {@link DateField}
* @return 字段最小值
* @since 4.5.7
* @see Calendar#getActualMinimum(int)
* @since 4.5.7
*/
public static int getBeginValue(Calendar calendar, int dateField) {
if (Calendar.DAY_OF_WEEK == dateField) {
@ -1887,8 +1899,8 @@ public class DateUtil {
* @param calendar {@link Calendar}
* @param dateField {@link DateField}
* @return 字段最大值
* @since 4.5.7
* @see Calendar#getActualMaximum(int)
* @since 4.5.7
*/
public static int getEndValue(Calendar calendar, int dateField) {
if (Calendar.DAY_OF_WEEK == dateField) {
@ -1943,7 +1955,54 @@ public class DateUtil {
return duration / 1_000_000_000.0;
}
/**
* Date对象转换为{@link Instant}对象
*
* @param date Date对象
* @return {@link Instant}对象
* @since 5.0.2
*/
public static Instant toInstant(Date date) {
return null == date ? null : date.toInstant();
}
/**
* Date对象转换为{@link Instant}对象
*
* @param temporalAccessor Date对象
* @return {@link Instant}对象
* @since 5.0.2
*/
public static Instant toInstant(TemporalAccessor temporalAccessor) {
if (null == temporalAccessor) {
return null;
}
Instant result;
if (temporalAccessor instanceof Instant) {
result = (Instant) temporalAccessor;
} else if (temporalAccessor instanceof LocalDateTime) {
result = ((LocalDateTime) temporalAccessor).atZone(ZoneId.systemDefault()).toInstant();
} else if (temporalAccessor instanceof ZonedDateTime) {
result = ((ZonedDateTime) temporalAccessor).toInstant();
} else if (temporalAccessor instanceof OffsetDateTime) {
result = ((OffsetDateTime) temporalAccessor).toInstant();
} else if (temporalAccessor instanceof LocalDate) {
result = ((LocalDate) temporalAccessor).atStartOfDay(ZoneId.systemDefault()).toInstant();
} else if (temporalAccessor instanceof LocalTime) {
// 指定本地时间转换 为Instant取当天日期
result = ((LocalTime) temporalAccessor).atDate(LocalDate.now()).atZone(ZoneId.systemDefault()).toInstant();
} else if (temporalAccessor instanceof OffsetTime) {
// 指定本地时间转换 为Instant取当天日期
result = ((OffsetTime) temporalAccessor).atDate(LocalDate.now()).toInstant();
} else {
result = Instant.from(temporalAccessor);
}
return result;
}
// ------------------------------------------------------------------------ Private method start
/**
* 获得指定日期年份和季节<br>
* 格式[20131]表示2013年第一季度
@ -1964,13 +2023,13 @@ public class DateUtil {
* ""
* ""
* </pre>
*
* <p>
* 将以下字符去除
*
* <pre>
* ""
* </pre>
*
* <p>
* 将以下字符替换为":"
*
* <pre>
@ -1978,7 +2037,7 @@ public class DateUtil {
* ""
* ""
* </pre>
*
* <p>
* 当末位是":"时去除之不存在毫秒时
*
* @param dateStr 日期时间字符串

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