diff --git common/src/java/org/apache/hadoop/hive/common/type/TimestampTZ.java common/src/java/org/apache/hadoop/hive/common/type/TimestampTZ.java index af181ba124..f4bfaadd2a 100644 --- common/src/java/org/apache/hadoop/hive/common/type/TimestampTZ.java +++ common/src/java/org/apache/hadoop/hive/common/type/TimestampTZ.java @@ -32,6 +32,7 @@ public class TimestampTZ implements Comparable { private static final ZonedDateTime EPOCH = ZonedDateTime.ofInstant(Instant.EPOCH, ZoneOffset.UTC); + public static final ZoneId UTC = ZoneId.of("UTC"); private ZonedDateTime zonedDateTime; @@ -67,7 +68,12 @@ public void setZonedDateTime(ZonedDateTime zonedDateTime) { @Override public String toString() { - return zonedDateTime.format(TimestampTZUtil.FORMATTER); + return zonedDateTime.format(TimestampTZUtil.FORMATTER_WITHOUT_TIME_ZONE); + } + + public String toUTCString() { + return zonedDateTime.withZoneSameInstant(UTC) + .format(TimestampTZUtil.FORMATTER_WITH_TIME_ZONE); } @Override diff --git common/src/java/org/apache/hadoop/hive/common/type/TimestampTZUtil.java common/src/java/org/apache/hadoop/hive/common/type/TimestampTZUtil.java index 213650c2a5..908b081a9b 100644 --- common/src/java/org/apache/hadoop/hive/common/type/TimestampTZUtil.java +++ common/src/java/org/apache/hadoop/hive/common/type/TimestampTZUtil.java @@ -17,8 +17,6 @@ */ package org.apache.hadoop.hive.common.type; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.time.DateTimeException; import java.time.LocalDate; import java.time.LocalTime; @@ -43,7 +41,8 @@ private static final LocalTime DEFAULT_LOCAL_TIME = LocalTime.of(0, 0); private static final Pattern SINGLE_DIGIT_PATTERN = Pattern.compile("[\\+-]\\d:\\d\\d"); - static final DateTimeFormatter FORMATTER; + static final DateTimeFormatter FORMATTER_WITH_TIME_ZONE; + static final DateTimeFormatter FORMATTER_WITHOUT_TIME_ZONE; static { DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); // Date part @@ -53,11 +52,13 @@ optionalStart().appendFraction(ChronoField.NANO_OF_SECOND, 1, 9, true). optionalEnd().optionalEnd(); + FORMATTER_WITHOUT_TIME_ZONE = builder.toFormatter(); + // Zone part builder.optionalStart().appendLiteral(" ").optionalEnd(); builder.optionalStart().appendZoneText(TextStyle.NARROW).optionalEnd(); - FORMATTER = builder.toFormatter(); + FORMATTER_WITH_TIME_ZONE = builder.toFormatter(); } public static TimestampTZ parse(String s) { @@ -69,11 +70,11 @@ public static TimestampTZ parse(String s, ZoneId defaultTimeZone) { s = handleSingleDigitHourOffset(s); ZonedDateTime zonedDateTime; try { - zonedDateTime = ZonedDateTime.parse(s, FORMATTER); + zonedDateTime = ZonedDateTime.parse(s, FORMATTER_WITH_TIME_ZONE); } catch (DateTimeParseException e) { // try to be more tolerant // if the input is invalid instead of incomplete, we'll hit exception here again - TemporalAccessor accessor = FORMATTER.parse(s); + TemporalAccessor accessor = FORMATTER_WITH_TIME_ZONE.parse(s); // LocalDate must be present LocalDate localDate = LocalDate.from(accessor); LocalTime localTime; diff --git common/src/test/org/apache/hadoop/hive/common/type/TestTimestampTZ.java common/src/test/org/apache/hadoop/hive/common/type/TestTimestampTZ.java index cd23abebfa..645aa20b6d 100644 --- common/src/test/org/apache/hadoop/hive/common/type/TestTimestampTZ.java +++ common/src/test/org/apache/hadoop/hive/common/type/TestTimestampTZ.java @@ -30,7 +30,7 @@ public void testConvertToUTC() { String s = "2017-04-14 18:00:00 Asia/Shanghai"; TimestampTZ timestampTZ = TimestampTZUtil.parse(s, ZoneId.of("UTC")); - Assert.assertEquals("2017-04-14 10:00:00.0 UTC", timestampTZ.toString()); + Assert.assertEquals("2017-04-14 10:00:00.0", timestampTZ.toString()); } @Test @@ -67,10 +67,10 @@ public void testFromToInstant() { Assert.assertEquals(tstz, new TimestampTZ(seconds, nanos, ZoneId.of("UTC"))); nanos += 123000000; - Assert.assertEquals("2017-04-14 18:00:00.123 UTC", new TimestampTZ(seconds, nanos, ZoneId.of("UTC")).toString()); + Assert.assertEquals("2017-04-14 18:00:00.123", new TimestampTZ(seconds, nanos, ZoneId.of("UTC")).toString()); seconds -= 3; - Assert.assertEquals("2017-04-14 17:59:57.123 UTC", new TimestampTZ(seconds, nanos, ZoneId.of("UTC")).toString()); + Assert.assertEquals("2017-04-14 17:59:57.123", new TimestampTZ(seconds, nanos, ZoneId.of("UTC")).toString()); } @Test diff --git serde/src/java/org/apache/hadoop/hive/serde2/io/TimestampLocalTZWritable.java serde/src/java/org/apache/hadoop/hive/serde2/io/TimestampLocalTZWritable.java index 3ffcb7a425..48084aab59 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/io/TimestampLocalTZWritable.java +++ serde/src/java/org/apache/hadoop/hive/serde2/io/TimestampLocalTZWritable.java @@ -246,6 +246,11 @@ public String toString() { populateTimestampTZ(); return timestampTZ.toString(); } + + public String toUTCString() { + populateTimestampTZ(); + return timestampTZ.toUTCString(); + } @Override public void write(DataOutput dataOutput) throws IOException { diff --git serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyTimestampLocalTZ.java serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyTimestampLocalTZ.java index a96984039c..dead8d692a 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyTimestampLocalTZ.java +++ serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyTimestampLocalTZ.java @@ -96,7 +96,7 @@ public static void writeUTF8(OutputStream out, TimestampLocalTZWritable i) throw if (i == null) { out.write(TimestampLocalTZWritable.nullBytes); } else { - out.write(i.toString().getBytes("US-ASCII")); + out.write(i.toUTCString().getBytes("US-ASCII")); } } }