Kaynağa Gözat

修复带时区日期转换不正确问题

woody 10 ay önce
ebeveyn
işleme
4bc58f9e65

+ 19 - 1
framework-common/src/main/java/com/chelvc/framework/common/util/DateUtils.java

@@ -4,6 +4,7 @@ import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
+import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
 import java.util.Calendar;
@@ -114,7 +115,7 @@ public final class DateUtils {
                     new DatetimeParser(DateTimeFormatter.ofPattern("yyyy-M-d H:m:s.SSS"))
             ).put(
                     StringUtils.getPattern("^\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}\\S+$"),
-                    new DatetimeParser(DateTimeFormatter.ofPattern("yyyy-M-d'T'H:m:s.SSSXXX"))
+                    new ZonedDatetimeParser(DateTimeFormatter.ofPattern("yyyy-M-d'T'H:m:s.SSSXXX"))
             ).put(
                     StringUtils.getPattern(
                             "^[a-zA-Z]{3} [a-zA-Z]{3} [0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} CST [0-9]{4}$"
@@ -181,6 +182,23 @@ public final class DateUtils {
         }
     }
 
+    /**
+     * 带时区日期时间文本解析实现
+     */
+    public static class ZonedDatetimeParser implements Parser {
+        private final DateTimeFormatter formatter;
+
+        public ZonedDatetimeParser(@NonNull DateTimeFormatter formatter) {
+            this.formatter = formatter;
+        }
+
+        @Override
+        public Date parse(String text) {
+            ZonedDateTime zoned = ZonedDateTime.parse(text, formatter);
+            return convert(zoned.withZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime());
+        }
+    }
+
     /**
      * 查找日期文本对应的解析器
      *