From db2e1f0c0b6bbf4683bbc2b876500141961becc0 Mon Sep 17 00:00:00 2001 From: Nathan Beyer Date: Sun, 18 Sep 2016 21:23:05 -0500 Subject: [PATCH] Handle additional time offset formats of ISO 8601 --- .../spark/sql/catalyst/util/DateTimeUtils.scala | 11 ++++++++++- .../spark/sql/catalyst/util/DateTimeUtilsSuite.scala | 9 +++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/DateTimeUtils.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/DateTimeUtils.scala index 0b643a5b84268..4af71c9b90e4f 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/DateTimeUtils.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/DateTimeUtils.scala @@ -137,7 +137,16 @@ object DateTimeUtils { Date.valueOf(s) } } else { - DatatypeConverter.parseDateTime(s).getTime() + val offsetRegEx = """^.*(([+-]\d\d)(\d\d)?)$""".r + s match { + case offsetRegEx(offset, hour, min) => { + min match { + case null => stringToTime(s.replaceAllLiterally(offset, hour + ":00")) + case _ => stringToTime(s.replaceAllLiterally(offset, hour + ":" + min)) + } + } + case _ => DatatypeConverter.parseDateTime(s).getTime() + } } } diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/DateTimeUtilsSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/DateTimeUtilsSuite.scala index 4f516d006458e..ca0b082445084 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/DateTimeUtilsSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/DateTimeUtilsSuite.scala @@ -151,9 +151,14 @@ class DateTimeUtilsSuite extends SparkFunSuite { c.set(1900, 0, 1, 0, 0, 0) assert(stringToTime("1900-01-01T00:00:00GMT-00:00") === c.getTime()) + assert(stringToTime("1900-01-01T00:00:00GMT-0000") === c.getTime()) + assert(stringToTime("1900-01-01T00:00:00GMT-00") === c.getTime()) c.set(2000, 11, 30, 10, 0, 0) assert(stringToTime("2000-12-30T10:00:00Z") === c.getTime()) + assert(stringToTime("2000-12-30T10:00:00+00:00") === c.getTime()) + assert(stringToTime("2000-12-30T10:00:00+0000") === c.getTime()) + assert(stringToTime("2000-12-30T10:00:00+00") === c.getTime()) // Tests with set time zone. c.setTimeZone(TimeZone.getTimeZone("GMT-04:00")) @@ -161,9 +166,13 @@ class DateTimeUtilsSuite extends SparkFunSuite { c.set(1900, 0, 1, 0, 0, 0) assert(stringToTime("1900-01-01T00:00:00-04:00") === c.getTime()) + assert(stringToTime("1900-01-01T00:00:00-0400") === c.getTime()) + assert(stringToTime("1900-01-01T00:00:00-04") === c.getTime()) c.set(1900, 0, 1, 0, 0, 0) assert(stringToTime("1900-01-01T00:00:00GMT-04:00") === c.getTime()) + assert(stringToTime("1900-01-01T00:00:00GMT-0400") === c.getTime()) + assert(stringToTime("1900-01-01T00:00:00GMT-04") === c.getTime()) // Tests with local time zone. c.setTimeZone(TimeZone.getDefault())