ソースを参照

fix time and add test

Looly 6 年 前
コミット
105eb4c5ff

+ 1 - 0
CHANGELOG.md

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

+ 4 - 0
hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java

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

+ 76 - 7
hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java

@@ -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 localDateTime {@link LocalDateTime}对象
+	 * @return java.time中的对象
+	 */
+	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 TemporalAccessor对象
+	 * @param instant {@link Instant}对象
 	 * @return java.time中的对象
 	 */
-	private TemporalAccessor parseFromIntant(Instant instant) {
+	private TemporalAccessor parseFromInstant(Instant instant) {
 		if(Instant.class.equals(this.targetType)){
 			return instant;
 		}else if (LocalDateTime.class.equals(this.targetType)) {

+ 1 - 1
hutool-core/src/main/java/cn/hutool/core/date/DateTime.java

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

ファイルの差分が大きいため隠しています
+ 268 - 209
hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java


+ 0 - 22
hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java

@@ -141,28 +141,6 @@ public class ConvertTest {
 	}
 
 	@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
 		int int0 = 234;

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

@@ -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());
+	}
+}

+ 34 - 2
hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java

@@ -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());
+	}
 }

+ 2 - 0
hutool-core/src/test/java/cn/hutool/core/util/IdcardUtilTest.java

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

+ 1 - 6
hutool-db/src/main/java/cn/hutool/db/sql/Wrapper.java

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