[NO ISSUE][FUN] Add helper method to find time zone
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- Add method DateTimeFormatUtils.findTimeZone()
to find time zone by its name
Change-Id: I4ce576f98dc1fd58f7b12afa39b1286f7b652a49
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2602
Sonar-Qube: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Till Westmann <tillw@apache.org>
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DateTimeFormatUtils.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DateTimeFormatUtils.java
index f837e36..98abb97 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DateTimeFormatUtils.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DateTimeFormatUtils.java
@@ -148,20 +148,20 @@
};
private static final byte[][] TIMEZONE_IDS;
- private static final int[] TIMEZONE_OFFSETS;
+ private static final TimeZone[] TIMEZONE_VALUES;
static {
String[] tzIds = TimeZone.getAvailableIDs();
int tzCount = tzIds.length;
TIMEZONE_IDS = new byte[tzCount][];
- TIMEZONE_OFFSETS = new int[tzCount];
+ TIMEZONE_VALUES = new TimeZone[tzCount];
for (int i = 0; i < tzCount; i++) {
TIMEZONE_IDS[i] = tzIds[i].getBytes(ENCODING);
}
Arrays.sort(TIMEZONE_IDS, byteArrayComparator);
for (int i = 0; i < tzCount; i++) {
- TIMEZONE_OFFSETS[i] = TimeZone.getTimeZone(new String(TIMEZONE_IDS[i], ENCODING)).getRawOffset();
+ TIMEZONE_VALUES[i] = TimeZone.getTimeZone(new String(TIMEZONE_IDS[i], ENCODING));
}
}
@@ -241,9 +241,10 @@
return -1;
}
- private int binaryTimezoneIDSearch(byte[] barray, int start, int length) {
- return Arrays.binarySearch(TIMEZONE_IDS, 0, TIMEZONE_IDS.length,
+ public static TimeZone findTimeZone(byte[] barray, int start, int length) {
+ int idx = Arrays.binarySearch(TIMEZONE_IDS, 0, TIMEZONE_IDS.length,
Arrays.copyOfRange(barray, start, start + length), byteArrayComparator);
+ return idx >= 0 ? TIMEZONE_VALUES[idx] : null;
}
private int indexOf(byte[] barray, int start, int length, char c) {
@@ -683,10 +684,10 @@
|| data[dataStart + timezoneEndField] == '_')) {
timezoneEndField++;
}
- int searchIdx = binaryTimezoneIDSearch(data, dataStart + dataStringPointer,
- timezoneEndField - dataStringPointer);
- if (searchIdx >= 0) {
- timezone = TIMEZONE_OFFSETS[searchIdx];
+ TimeZone tz =
+ findTimeZone(data, dataStart + dataStringPointer, timezoneEndField - dataStringPointer);
+ if (tz != null) {
+ timezone = tz.getRawOffset();
} else {
if (raiseParseDataError) {
throw new AsterixTemporalTypeParseException("Unexpected timezone string: " + new String(