You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by xx...@apache.org on 2023/04/21 08:48:34 UTC

[kylin] 06/09: KYLIN-5519 DateFormatTest shouldn't rely on user's timezone

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

xxyu pushed a commit to branch kylin5
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit e5a526ee1ede46f50059ac2e730d818efa283b94
Author: Shaofeng Shi <sh...@apache.org>
AuthorDate: Wed Apr 19 15:51:45 2023 +0800

    KYLIN-5519 DateFormatTest shouldn't rely on user's timezone
---
 .../org/apache/kylin/common/util/DateFormat.java   | 29 +++++++---
 .../apache/kylin/common/util/DateFormatTest.java   | 65 +++++++++++-----------
 2 files changed, 54 insertions(+), 40 deletions(-)

diff --git a/src/core-common/src/main/java/org/apache/kylin/common/util/DateFormat.java b/src/core-common/src/main/java/org/apache/kylin/common/util/DateFormat.java
index f94cf91213..f3d31dd835 100644
--- a/src/core-common/src/main/java/org/apache/kylin/common/util/DateFormat.java
+++ b/src/core-common/src/main/java/org/apache/kylin/common/util/DateFormat.java
@@ -127,16 +127,17 @@ public class DateFormat {
     }
 
     public static FastDateFormat getDateFormat(String datePattern) {
-        FastDateFormat r = formatMap.get(datePattern);
-        if (r == null) {
-            r = FastDateFormat.getInstance(datePattern, TimeZone.getDefault());
-            formatMap.put(datePattern, r);
-        }
-        return r;
+        return getDateFormat(datePattern, TimeZone.getDefault());
     }
 
     public static FastDateFormat getDateFormat(String datePattern, TimeZone timeZone) {
-        return FastDateFormat.getInstance(datePattern, timeZone);
+        String key = datePattern + timeZone.getID();
+        FastDateFormat r = formatMap.get(key);
+        if (r == null) {
+            r = FastDateFormat.getInstance(datePattern, timeZone);
+            formatMap.put(key, r);
+        }
+        return r;
     }
 
     public static String formatToCompactDateStr(long millis) {
@@ -197,20 +198,30 @@ public class DateFormat {
         return stringToDate(str, DEFAULT_DATE_PATTERN);
     }
 
+
     public static Date stringToDate(String str, String pattern) {
+        return stringToDate(str, pattern, TimeZone.getDefault());
+    }
+
+    public static Date stringToDate(String str, String pattern, TimeZone timeZone) {
         Date date;
         try {
-            date = getDateFormat(pattern).parse(str);
+            date = getDateFormat(pattern, timeZone).parse(str);
         } catch (ParseException e) {
             throw new IllegalArgumentException("'" + str + "' is not a valid date of pattern '" + pattern + "'", e);
         }
         return date;
     }
 
+
     public static long stringToMillis(String str) {
+        return stringToMillis(str, TimeZone.getDefault());
+    }
+
+    public static long stringToMillis(String str, TimeZone timeZone) {
         for (Map.Entry<String, String> regexToPattern : dateFormatRegex.entrySet()) {
             if (str.matches(regexToPattern.getKey()))
-                return stringToDate(str, regexToPattern.getValue()).getTime();
+                return stringToDate(str, regexToPattern.getValue(), timeZone).getTime();
         }
 
         try {
diff --git a/src/core-common/src/test/java/org/apache/kylin/common/util/DateFormatTest.java b/src/core-common/src/test/java/org/apache/kylin/common/util/DateFormatTest.java
index 0387906235..df723d624a 100644
--- a/src/core-common/src/test/java/org/apache/kylin/common/util/DateFormatTest.java
+++ b/src/core-common/src/test/java/org/apache/kylin/common/util/DateFormatTest.java
@@ -23,6 +23,7 @@ import java.time.ZoneId;
 import java.time.format.DateTimeParseException;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.TimeZone;
 
 import org.apache.kylin.common.exception.KylinException;
 import org.apache.kylin.junit.annotation.MultiTimezoneTest;
@@ -196,43 +197,45 @@ public class DateFormatTest {
     public void testStringToMillis() {
         // 2022-12-01 00:00:00
         long expectedMillis = 1669824000000L;
-
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022.12.01 00:00"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("202212"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022.12.01 00:00:00"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022-12-01 00:00:00:000"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("20221201"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022.12.01 00:00:00:000"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022.12.01"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022/12/01 00:00"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022-12-01 00:00:00.000"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022/12/01 00:00:00:000"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("20221201 00:00"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022-12-01 00:00"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("20221201 00:00:00:000"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("20221201 00:00:00"));
+        TimeZone timeZone = TimeZone.getTimeZone("GMT+8");
+
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022.12.01 00:00", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("202212", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022.12.01 00:00:00", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022-12-01 00:00:00:000", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("20221201", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022.12.01 00:00:00:000", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022.12.01", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022/12/01 00:00", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022-12-01 00:00:00.000", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022/12/01 00:00:00:000", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("20221201 00:00", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022-12-01 00:00", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("20221201 00:00:00:000", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("20221201 00:00:00", timeZone));
     }
 
     @Test
     public void testStringToMillisSupplement() {
         long expectedMillis = 1669824000000L;
 
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022/12/01 00:00:00"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("20221201T00:00:00.000Z"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022-12"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022.12.01T00:00:00.000Z"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022-12-01"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022-12-01 00:00:00"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022/12/01"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("20221201 00:00:00.000"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022-12-01T00:00:00.000Z"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022/12/01T00:00:00.000Z"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022.12.01 00:00:00.000"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022-12-01T00:00:00.000+08:00"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022/12/01 00:00:00.000"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("1669824000000000"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("1669824000000"));
-        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("1669824000"));
+        TimeZone timeZone = TimeZone.getTimeZone("GMT+8");
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022/12/01 00:00:00", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("20221201T00:00:00.000Z", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022-12", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022.12.01T00:00:00.000Z", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022-12-01", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022-12-01 00:00:00", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022/12/01", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("20221201 00:00:00.000", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022-12-01T00:00:00.000Z", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022/12/01T00:00:00.000Z", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022.12.01 00:00:00.000", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022-12-01T00:00:00.000+08:00", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("2022/12/01 00:00:00.000", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("1669824000000000", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("1669824000000", timeZone));
+        Assert.assertEquals(expectedMillis, DateFormat.stringToMillis("1669824000", timeZone));
     }
 
     @Test