diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a6d855fd..bdea9025b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ * 【core 】 修复FileUtil.normalize处理上级路径的问题(issue#I3YPEH@Gitee) * 【core 】 修复ClassScanner扫描空包遗漏问题 * 【core 】 修复FastDatePrinter歧义问题(pr#366@Gitee) +* 【core 】 修复DateUtil.format格式化Instant报错问题(issue#I40CY2@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DatePattern.java b/hutool-core/src/main/java/cn/hutool/core/date/DatePattern.java index 236435ead..8feeac0ce 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DatePattern.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DatePattern.java @@ -2,6 +2,7 @@ package cn.hutool.core.date; import cn.hutool.core.date.format.FastDateFormat; +import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Locale; import java.util.TimeZone; @@ -39,7 +40,7 @@ public class DatePattern { /** * 年月格式 {@link FastDateFormat}:yyyy-MM */ - public static final DateTimeFormatter NORM_MONTH_FORMATTER = DateTimeFormatter.ofPattern(NORM_MONTH_PATTERN); + public static final DateTimeFormatter NORM_MONTH_FORMATTER = createFormatter(NORM_MONTH_PATTERN); /** * 简单年月格式:yyyyMM @@ -52,7 +53,7 @@ public class DatePattern { /** * 简单年月格式 {@link FastDateFormat}:yyyyMM */ - public static final DateTimeFormatter SIMPLE_MONTH_FORMATTER = DateTimeFormatter.ofPattern(SIMPLE_MONTH_PATTERN); + public static final DateTimeFormatter SIMPLE_MONTH_FORMATTER = createFormatter(SIMPLE_MONTH_PATTERN); /** * 标准日期格式:yyyy-MM-dd @@ -65,7 +66,7 @@ public class DatePattern { /** * 标准日期格式 {@link FastDateFormat}:yyyy-MM-dd */ - public static final DateTimeFormatter NORM_DATE_FORMATTER = DateTimeFormatter.ofPattern(NORM_DATE_PATTERN); + public static final DateTimeFormatter NORM_DATE_FORMATTER = createFormatter(NORM_DATE_PATTERN); /** * 标准时间格式:HH:mm:ss @@ -78,7 +79,7 @@ public class DatePattern { /** * 标准日期格式 {@link FastDateFormat}:HH:mm:ss */ - public static final DateTimeFormatter NORM_TIME_FORMATTER = DateTimeFormatter.ofPattern(NORM_TIME_PATTERN); + public static final DateTimeFormatter NORM_TIME_FORMATTER = createFormatter(NORM_TIME_PATTERN); /** * 标准日期时间格式,精确到分:yyyy-MM-dd HH:mm @@ -91,7 +92,7 @@ public class DatePattern { /** * 标准日期格式 {@link FastDateFormat}:yyyy-MM-dd HH:mm */ - public static final DateTimeFormatter NORM_DATETIME_MINUTE_FORMATTER = DateTimeFormatter.ofPattern(NORM_DATETIME_MINUTE_PATTERN); + public static final DateTimeFormatter NORM_DATETIME_MINUTE_FORMATTER = createFormatter(NORM_DATETIME_MINUTE_PATTERN); /** * 标准日期时间格式,精确到秒:yyyy-MM-dd HH:mm:ss @@ -104,7 +105,7 @@ public class DatePattern { /** * 标准日期时间格式,精确到秒 {@link FastDateFormat}:yyyy-MM-dd HH:mm:ss */ - public static final DateTimeFormatter NORM_DATETIME_FORMATTER = DateTimeFormatter.ofPattern(NORM_DATETIME_PATTERN); + public static final DateTimeFormatter NORM_DATETIME_FORMATTER = createFormatter(NORM_DATETIME_PATTERN); /** * 标准日期时间格式,精确到毫秒:yyyy-MM-dd HH:mm:ss.SSS @@ -117,7 +118,7 @@ public class DatePattern { /** * 标准日期时间格式,精确到毫秒 {@link FastDateFormat}:yyyy-MM-dd HH:mm:ss.SSS */ - public static final DateTimeFormatter NORM_DATETIME_MS_FORMATTER = DateTimeFormatter.ofPattern(NORM_DATETIME_MS_PATTERN); + public static final DateTimeFormatter NORM_DATETIME_MS_FORMATTER = createFormatter(NORM_DATETIME_MS_PATTERN); /** * ISO8601日期时间格式,精确到毫秒:yyyy-MM-dd HH:mm:ss,SSS @@ -130,7 +131,7 @@ public class DatePattern { /** * 标准日期格式 {@link FastDateFormat}:yyyy-MM-dd HH:mm:ss,SSS */ - public static final DateTimeFormatter ISO8601_FORMATTER = DateTimeFormatter.ofPattern(ISO8601_PATTERN); + public static final DateTimeFormatter ISO8601_FORMATTER = createFormatter(ISO8601_PATTERN); /** * 标准日期格式:yyyy年MM月dd日 @@ -143,7 +144,7 @@ public class DatePattern { /** * 标准日期格式 {@link FastDateFormat}:yyyy年MM月dd日 */ - public static final DateTimeFormatter CHINESE_DATE_FORMATTER = DateTimeFormatter.ofPattern(ISO8601_PATTERN); + public static final DateTimeFormatter CHINESE_DATE_FORMATTER = createFormatter(ISO8601_PATTERN); /** * 标准日期格式:yyyy年MM月dd日 HH时mm分ss秒 @@ -156,7 +157,7 @@ public class DatePattern { /** * 标准日期格式 {@link FastDateFormat}:yyyy年MM月dd日HH时mm分ss秒 */ - public static final DateTimeFormatter CHINESE_DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern(CHINESE_DATE_TIME_PATTERN); + public static final DateTimeFormatter CHINESE_DATE_TIME_FORMATTER = createFormatter(CHINESE_DATE_TIME_PATTERN); //-------------------------------------------------------------------------------------------------------------------------------- Pure /** @@ -170,7 +171,7 @@ public class DatePattern { /** * 标准日期格式 {@link FastDateFormat}:yyyyMMdd */ - public static final DateTimeFormatter PURE_DATE_FORMATTER = DateTimeFormatter.ofPattern(PURE_DATE_PATTERN); + public static final DateTimeFormatter PURE_DATE_FORMATTER = createFormatter(PURE_DATE_PATTERN); /** * 标准日期格式:HHmmss @@ -183,7 +184,7 @@ public class DatePattern { /** * 标准日期格式 {@link FastDateFormat}:HHmmss */ - public static final DateTimeFormatter PURE_TIME_FORMATTER = DateTimeFormatter.ofPattern(PURE_TIME_PATTERN); + public static final DateTimeFormatter PURE_TIME_FORMATTER = createFormatter(PURE_TIME_PATTERN); /** * 标准日期格式:yyyyMMddHHmmss @@ -196,7 +197,7 @@ public class DatePattern { /** * 标准日期格式 {@link FastDateFormat}:yyyyMMddHHmmss */ - public static final DateTimeFormatter PURE_DATETIME_FORMATTER = DateTimeFormatter.ofPattern(PURE_DATETIME_PATTERN); + public static final DateTimeFormatter PURE_DATETIME_FORMATTER = createFormatter(PURE_DATETIME_PATTERN); /** * 标准日期格式:yyyyMMddHHmmssSSS @@ -209,7 +210,7 @@ public class DatePattern { /** * 标准日期格式 {@link FastDateFormat}:yyyyMMddHHmmssSSS */ - public static final DateTimeFormatter PURE_DATETIME_MS_FORMATTER = DateTimeFormatter.ofPattern(PURE_DATETIME_MS_PATTERN); + public static final DateTimeFormatter PURE_DATETIME_MS_FORMATTER = createFormatter(PURE_DATETIME_MS_PATTERN); //-------------------------------------------------------------------------------------------------------------------------------- Others /** @@ -283,4 +284,16 @@ public class DatePattern { * UTC时间{@link FastDateFormat}:yyyy-MM-dd'T'HH:mm:ssZ */ public static final FastDateFormat UTC_MS_WITH_ZONE_OFFSET_FORMAT = FastDateFormat.getInstance(UTC_MS_WITH_ZONE_OFFSET_PATTERN, TimeZone.getTimeZone("UTC")); + + /** + * 创建并为 {@link DateTimeFormatter} 赋予默认时区和位置信息,默认值为系统默认值。 + * + * @param pattern 日期格式 + * @return {@link DateTimeFormatter} + * @since 5.7.5 + */ + private static DateTimeFormatter createFormatter(String pattern) { + return DateTimeFormatter.ofPattern(pattern, Locale.getDefault()) + .withZone(ZoneId.systemDefault()); + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java index a81d2af2a..32daa37cf 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java @@ -541,7 +541,7 @@ public class DateUtil extends CalendarUtil { if (null == format || null == date) { return null; } - return format.format(date.toInstant()); + return TemporalAccessorUtil.format(date.toInstant(), format); } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/date/TemporalAccessorUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/TemporalAccessorUtil.java index e6d33578a..f2918c55e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/TemporalAccessorUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/TemporalAccessorUtil.java @@ -56,7 +56,6 @@ public class TemporalAccessorUtil extends TemporalUtil{ formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; } - try { return formatter.format(time); } catch (UnsupportedTemporalTypeException e){ @@ -66,6 +65,9 @@ public class TemporalAccessorUtil extends TemporalUtil{ }else if(time instanceof LocalTime && e.getMessage().contains("YearOfEra")){ // 用户传入LocalTime,但是要求格式化带有日期部分,转换为LocalDateTime重试 return formatter.format(((LocalTime) time).atDate(LocalDate.now())); + } else if(time instanceof Instant){ + // 时间戳没有时区信息,赋予默认时区 + return formatter.format(((Instant) time).atZone(ZoneId.systemDefault())); } throw e; } diff --git a/hutool-core/src/main/java/cn/hutool/core/math/Calculator.java b/hutool-core/src/main/java/cn/hutool/core/math/Calculator.java index 5a63258d6..b69fcc594 100644 --- a/hutool-core/src/main/java/cn/hutool/core/math/Calculator.java +++ b/hutool-core/src/main/java/cn/hutool/core/math/Calculator.java @@ -155,11 +155,7 @@ public class Calculator { * @return 优先级 */ public boolean compare(char cur, char peek) {// 如果是peek优先级高于cur,返回true,默认都是peek优先级要低 - boolean result = false; - if (operatPriority[(peek) - 40] >= operatPriority[(cur) - 40]) { - result = true; - } - return result; + return operatPriority[(peek) - 40] >= operatPriority[(cur) - 40]; } /** diff --git a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java index d80795466..25bbedf22 100644 --- a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java @@ -893,4 +893,14 @@ public class DateUtilTest { // 在日期格式不匹配的时候,测试是否正常报错 DateUtil.parse("2020-12-23", DatePattern.PURE_DATE_PATTERN); } + + @Test + public void formatNormDateTimeFormatterTest(){ + String format = DateUtil.format(DateUtil.parse("2021-07-14 10:05:38"), DatePattern.NORM_DATETIME_FORMATTER); + Assert.assertEquals("2021-07-14 10:05:38", format); + + format = DateUtil.format(LocalDateTimeUtil.parse("2021-07-14T10:05:38"), + "yyyy-MM-dd HH:mm:ss"); + Assert.assertEquals("2021-07-14 10:05:38", format); + } }