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