ソースを参照

add date to long support for Convert

Looly 5 年 前
コミット
a0b1a33654

+ 32 - 27
hutool-core/src/main/java/cn/hutool/core/convert/impl/NumberConverter.java

@@ -29,9 +29,8 @@ import java.util.concurrent.atomic.AtomicLong;
  * <li><code>java.math.BigDecimal</code></li>
  * <li><code>java.math.BigInteger</code></li>
  * </ul>
- * 
- * @author Looly
  *
+ * @author Looly
  */
 public class NumberConverter extends AbstractConverter<Number> {
 	private static final long serialVersionUID = 1L;
@@ -44,7 +43,7 @@ public class NumberConverter extends AbstractConverter<Number> {
 
 	/**
 	 * 构造<br>
-	 * 
+	 *
 	 * @param clazz 需要转换的数字类型,默认 {@link Number}
 	 */
 	public NumberConverter(Class<? extends Number> clazz) {
@@ -60,8 +59,8 @@ public class NumberConverter extends AbstractConverter<Number> {
 		if (Byte.class == targetType) {
 			if (value instanceof Number) {
 				return ((Number) value).byteValue();
-			} else if(value instanceof Boolean) {
-				return BooleanUtil.toByteObj((Boolean)value);
+			} else if (value instanceof Boolean) {
+				return BooleanUtil.toByteObj((Boolean) value);
 			}
 			final String valueStr = convertToStr(value);
 			return StrUtil.isBlank(valueStr) ? null : Byte.valueOf(valueStr);
@@ -69,8 +68,8 @@ public class NumberConverter extends AbstractConverter<Number> {
 		} else if (Short.class == targetType) {
 			if (value instanceof Number) {
 				return ((Number) value).shortValue();
-			} else if(value instanceof Boolean) {
-				return BooleanUtil.toShortObj((Boolean)value);
+			} else if (value instanceof Boolean) {
+				return BooleanUtil.toShortObj((Boolean) value);
 			}
 			final String valueStr = convertToStr(value);
 			return StrUtil.isBlank(valueStr) ? null : Short.valueOf(valueStr);
@@ -78,15 +77,21 @@ public class NumberConverter extends AbstractConverter<Number> {
 		} else if (Integer.class == targetType) {
 			if (value instanceof Number) {
 				return ((Number) value).intValue();
-			} else if(value instanceof Boolean) {
-				return BooleanUtil.toInteger((Boolean)value);
+			} else if (value instanceof Boolean) {
+				return BooleanUtil.toInteger((Boolean) value);
+			} else if (value instanceof Date) {
+				return (int)((Date) value).getTime();
+			} else if (value instanceof Calendar) {
+				return (int)((Calendar) value).getTimeInMillis();
+			} else if (value instanceof TemporalAccessor) {
+				return (int)DateUtil.toInstant((TemporalAccessor) value).toEpochMilli();
 			}
 			final String valueStr = convertToStr(value);
 			return StrUtil.isBlank(valueStr) ? null : NumberUtil.parseInt(valueStr);
 
 		} else if (AtomicInteger.class == targetType) {
 			final Number number = convertInternal(value, Integer.class);
-			if(null != number){
+			if (null != number) {
 				final AtomicInteger intValue = new AtomicInteger();
 				intValue.set(number.intValue());
 				return intValue;
@@ -95,8 +100,8 @@ public class NumberConverter extends AbstractConverter<Number> {
 		} else if (Long.class == targetType) {
 			if (value instanceof Number) {
 				return ((Number) value).longValue();
-			} else if(value instanceof Boolean) {
-				return BooleanUtil.toLongObj((Boolean)value);
+			} else if (value instanceof Boolean) {
+				return BooleanUtil.toLongObj((Boolean) value);
 			} else if (value instanceof Date) {
 				return ((Date) value).getTime();
 			} else if (value instanceof Calendar) {
@@ -109,7 +114,7 @@ public class NumberConverter extends AbstractConverter<Number> {
 
 		} else if (AtomicLong.class == targetType) {
 			final Number number = convertInternal(value, Long.class);
-			if(null != number){
+			if (null != number) {
 				final AtomicLong longValue = new AtomicLong();
 				longValue.set(number.longValue());
 				return longValue;
@@ -118,8 +123,8 @@ public class NumberConverter extends AbstractConverter<Number> {
 		} else if (Float.class == targetType) {
 			if (value instanceof Number) {
 				return ((Number) value).floatValue();
-			} else if(value instanceof Boolean) {
-				return BooleanUtil.toFloatObj((Boolean)value);
+			} else if (value instanceof Boolean) {
+				return BooleanUtil.toFloatObj((Boolean) value);
 			}
 			final String valueStr = convertToStr(value);
 			return StrUtil.isBlank(valueStr) ? null : Float.valueOf(valueStr);
@@ -127,8 +132,8 @@ public class NumberConverter extends AbstractConverter<Number> {
 		} else if (Double.class == targetType) {
 			if (value instanceof Number) {
 				return ((Number) value).doubleValue();
-			} else if(value instanceof Boolean) {
-				return BooleanUtil.toDoubleObj((Boolean)value);
+			} else if (value instanceof Boolean) {
+				return BooleanUtil.toDoubleObj((Boolean) value);
 			}
 			final String valueStr = convertToStr(value);
 			return StrUtil.isBlank(valueStr) ? null : Double.valueOf(valueStr);
@@ -139,11 +144,11 @@ public class NumberConverter extends AbstractConverter<Number> {
 		} else if (BigInteger.class == targetType) {
 			return toBigInteger(value);
 
-		}else if(Number.class == targetType){
+		} else if (Number.class == targetType) {
 			if (value instanceof Number) {
-				return (Number)value;
-			} else if(value instanceof Boolean) {
-				return BooleanUtil.toInteger((Boolean)value);
+				return (Number) value;
+			} else if (value instanceof Boolean) {
+				return BooleanUtil.toInteger((Boolean) value);
 			}
 			final String valueStr = convertToStr(value);
 			return StrUtil.isBlank(valueStr) ? null : NumberUtil.parseNumber(valueStr);
@@ -156,7 +161,7 @@ public class NumberConverter extends AbstractConverter<Number> {
 	 * 转换为BigDecimal<br>
 	 * 如果给定的值为空,或者转换失败,返回默认值<br>
 	 * 转换失败不会报错
-	 * 
+	 *
 	 * @param value 被转换的值
 	 * @return 结果
 	 */
@@ -167,8 +172,8 @@ public class NumberConverter extends AbstractConverter<Number> {
 			return new BigDecimal((Integer) value);
 		} else if (value instanceof BigInteger) {
 			return new BigDecimal((BigInteger) value);
-		} else if(value instanceof Boolean) {
-			return new BigDecimal((boolean)value ? 1 : 0);
+		} else if (value instanceof Boolean) {
+			return new BigDecimal((boolean) value ? 1 : 0);
 		}
 
 		//对于Double类型,先要转换为String,避免精度问题
@@ -183,15 +188,15 @@ public class NumberConverter extends AbstractConverter<Number> {
 	 * 转换为BigInteger<br>
 	 * 如果给定的值为空,或者转换失败,返回默认值<br>
 	 * 转换失败不会报错
-	 * 
+	 *
 	 * @param value 被转换的值
 	 * @return 结果
 	 */
 	private BigInteger toBigInteger(Object value) {
 		if (value instanceof Long) {
 			return BigInteger.valueOf((Long) value);
-		} else if(value instanceof Boolean) {
-			return BigInteger.valueOf((boolean)value ? 1 : 0);
+		} else if (value instanceof Boolean) {
+			return BigInteger.valueOf((boolean) value ? 1 : 0);
 		}
 		final String valueStr = convertToStr(value);
 		if (StrUtil.isBlank(valueStr)) {

+ 8 - 0
hutool-core/src/test/java/cn/hutool/core/convert/ConvertToNumberTest.java

@@ -17,6 +17,14 @@ public class ConvertToNumberTest {
 	}
 
 	@Test
+	public void dateToIntTest(){
+		final DateTime date = DateUtil.parse("2020-05-17 12:32:00");
+		final Integer dateInt = Convert.toInt(date);
+		assert date != null;
+		Assert.assertEquals((int)date.getTime(), dateInt.intValue());
+	}
+
+	@Test
 	public void dateToAtomicLongTest(){
 		final DateTime date = DateUtil.parse("2020-05-17 12:32:00");
 		final AtomicLong dateLong = Convert.convert(AtomicLong.class, date);