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 <shaofeng...@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