This is an automated email from the ASF dual-hosted git repository.

dataroaring pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new c298b1ca1a9 [fix](timezone) fix parse timezone when include GMT or 
time zone short ids (#25032)
c298b1ca1a9 is described below

commit c298b1ca1a9c7fb5be1b2520d300f41761146a6d
Author: yujun <[email protected]>
AuthorDate: Tue Oct 3 20:53:16 2023 +0800

    [fix](timezone) fix parse timezone when include GMT or time zone short ids 
(#25032)
---
 .../org/apache/doris/common/util/TimeUtils.java    | 41 ++++++++++++++++------
 .../apache/doris/common/util/TimeUtilsTest.java    |  5 ++-
 2 files changed, 35 insertions(+), 11 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/common/util/TimeUtils.java 
b/fe/fe-core/src/main/java/org/apache/doris/common/util/TimeUtils.java
index 06d7caad5d0..3f570a5f383 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/util/TimeUtils.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/TimeUtils.java
@@ -29,6 +29,7 @@ import org.apache.doris.qe.VariableMgr;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
@@ -44,7 +45,9 @@ import java.time.format.DateTimeParseException;
 import java.time.temporal.ChronoField;
 import java.time.temporal.TemporalAccessor;
 import java.util.Date;
+import java.util.Map;
 import java.util.TimeZone;
+import java.util.function.Function;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -53,9 +56,7 @@ public class TimeUtils {
     public static final String UTC_TIME_ZONE = "Europe/London"; // This is 
just a Country to represent UTC offset +00:00
     public static final String DEFAULT_TIME_ZONE = "Asia/Shanghai";
     public static final ZoneId TIME_ZONE;
-    // set CST to +08:00 instead of America/Chicago
-    public static final ImmutableMap<String, String> timeZoneAliasMap = 
ImmutableMap.of(
-            "CST", DEFAULT_TIME_ZONE, "PRC", DEFAULT_TIME_ZONE, "UTC", 
UTC_TIME_ZONE);
+    public static final ImmutableMap<String, String> timeZoneAliasMap;
     // NOTICE: Date formats are not synchronized.
     // it must be used as synchronized externally.
     public static final DateTimeFormatter DATE_FORMAT;
@@ -87,6 +88,17 @@ public class TimeUtils {
     static {
         TIME_ZONE = ZoneId.of("UTC+8");
 
+        Map<String, String> timeZoneMap = Maps.newHashMap();
+        timeZoneMap.putAll(ZoneId.SHORT_IDS);
+
+        // set CST to +08:00 instead of America/Chicago
+        timeZoneMap.put("CST", DEFAULT_TIME_ZONE);
+        timeZoneMap.put("PRC", DEFAULT_TIME_ZONE);
+        timeZoneMap.put("UTC", UTC_TIME_ZONE);
+        timeZoneMap.put("GMT", UTC_TIME_ZONE);
+
+        timeZoneAliasMap = ImmutableMap.copyOf(timeZoneMap);
+
         DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         DATE_FORMAT.withZone(TIME_ZONE);
 
@@ -253,22 +265,31 @@ public class TimeUtils {
 
     // Check if the time zone_value is valid
     public static String checkTimeZoneValidAndStandardize(String value) throws 
DdlException {
+        Function<String, String> standardizeValue = s -> {
+            boolean positive = s.charAt(0) != '-';
+            String[] parts = s.replaceAll("[+-]", "").split(":");
+            return (positive ? "+" : "-") + String.format("%02d:%02d",
+                    Integer.parseInt(parts[0]), Integer.parseInt(parts[1]));
+        };
+
         try {
             if (value == null) {
                 
ErrorReport.reportDdlException(ErrorCode.ERR_UNKNOWN_TIME_ZONE, "null");
             }
             // match offset type, such as +08:00, -07:00
             Matcher matcher = TIMEZONE_OFFSET_FORMAT_REG.matcher(value);
-            // it supports offset and region timezone type, "CST" use here is 
compatibility purposes.
+            // it supports offset and region timezone type, and short zone ids
             boolean match = matcher.matches();
-            if (!value.contains("/") && !value.equals("CST") && !match) {
-                
ErrorReport.reportDdlException(ErrorCode.ERR_UNKNOWN_TIME_ZONE, value);
+            if (!value.contains("/") && !timeZoneAliasMap.containsKey(value) 
&& !match) {
+                if ((value.startsWith("GMT") || value.startsWith("UTC"))
+                        && 
TIMEZONE_OFFSET_FORMAT_REG.matcher(value.substring(3)).matches()) {
+                    value = value.substring(0, 3) + 
standardizeValue.apply(value.substring(3));
+                } else {
+                    
ErrorReport.reportDdlException(ErrorCode.ERR_UNKNOWN_TIME_ZONE, value);
+                }
             }
             if (match) {
-                boolean positive = value.charAt(0) != '-';
-                value = (positive ? "+" : "-") + String.format("%02d:%02d",
-                        Integer.parseInt(value.replaceAll("[+-]", 
"").split(":")[0]),
-                        Integer.parseInt(value.replaceAll("[+-]", 
"").split(":")[1]));
+                value = standardizeValue.apply(value);
 
                 // timezone offsets around the world extended from -12:00 to 
+14:00
                 int tz = Integer.parseInt(value.substring(1, 3)) * 100 + 
Integer.parseInt(value.substring(4, 6));
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/common/util/TimeUtilsTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/common/util/TimeUtilsTest.java
index 4ebf2df6f2c..44491ed1cf6 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/common/util/TimeUtilsTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/common/util/TimeUtilsTest.java
@@ -164,12 +164,15 @@ public class TimeUtilsTest {
     public void testTimezone() throws AnalysisException {
         try {
             Assert.assertEquals("CST", 
TimeUtils.checkTimeZoneValidAndStandardize("CST"));
+            Assert.assertEquals("EST", 
TimeUtils.checkTimeZoneValidAndStandardize("EST"));
+            Assert.assertEquals("GMT+08:00", 
TimeUtils.checkTimeZoneValidAndStandardize("GMT+8:00"));
+            Assert.assertEquals("UTC+08:00", 
TimeUtils.checkTimeZoneValidAndStandardize("UTC+8:00"));
             Assert.assertEquals("+08:00", 
TimeUtils.checkTimeZoneValidAndStandardize("+08:00"));
             Assert.assertEquals("+08:00", 
TimeUtils.checkTimeZoneValidAndStandardize("+8:00"));
             Assert.assertEquals("-08:00", 
TimeUtils.checkTimeZoneValidAndStandardize("-8:00"));
             Assert.assertEquals("+08:00", 
TimeUtils.checkTimeZoneValidAndStandardize("8:00"));
         } catch (DdlException ex) {
-            Assert.fail();
+            Assert.assertTrue(ex.getMessage(), false);
         }
         try {
             TimeUtils.checkTimeZoneValidAndStandardize("FOO");


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to