mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-04-19 03:01:48 +08:00
fix time and add test
This commit is contained in:
parent
4b78dba298
commit
105eb4c5ff
@ -6,6 +6,7 @@
|
||||
## 5.0.2
|
||||
|
||||
### 新特性
|
||||
* 【core】 强化java.time包的对象转换支持
|
||||
### Bug修复
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
|
@ -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);
|
||||
|
@ -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)) {
|
||||
|
@ -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
@ -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
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
@ -7,6 +7,8 @@ import org.junit.Test;
|
||||
import cn.hutool.core.date.DateTime;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
|
||||
import java.time.ZonedDateTime;
|
||||
|
||||
/**
|
||||
* 身份证单元测试
|
||||
*
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user