aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHolden Karau <holden@us.ibm.com>2016-08-01 13:57:05 -0700
committerSean Owen <sowen@cloudera.com>2016-08-01 13:57:05 -0700
commitab1e761f9691b41385e2ed2202c5a671c63c963d (patch)
tree11fa3ff20df539cd5cefbad4dc8442a2ae0ee96c
parent338a98d65c8efe0c41f39a8dddeab7040dcda125 (diff)
downloadspark-ab1e761f9691b41385e2ed2202c5a671c63c963d.tar.gz
spark-ab1e761f9691b41385e2ed2202c5a671c63c963d.tar.bz2
spark-ab1e761f9691b41385e2ed2202c5a671c63c963d.zip
[SPARK-16774][SQL] Fix use of deprecated timestamp constructor & improve timezone handling
## What changes were proposed in this pull request? Removes the deprecated timestamp constructor and incidentally fixes the use which was using system timezone rather than the one specified when working near DST. This change also causes the roundtrip tests to fail since it now actually uses all the timezones near DST boundaries where it didn't before. Note: this is only a partial the solution, longer term we should follow up with https://issues.apache.org/jira/browse/SPARK-16788 to avoid this problem & simplify our timezone handling code. ## How was this patch tested? New tests for two timezones added so even if user timezone happens to coincided with one, the other tests should still fail. Important note: this (temporarily) disables the round trip tests until we can fix the issue more thoroughly. Author: Holden Karau <holden@us.ibm.com> Closes #14398 from holdenk/SPARK-16774-fix-use-of-deprecated-timestamp-constructor.
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/DateTimeUtils.scala14
-rw-r--r--sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/DateTimeUtilsSuite.scala3
2 files changed, 10 insertions, 7 deletions
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 df480a1d65..0b643a5b84 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
@@ -852,8 +852,10 @@ object DateTimeUtils {
/**
* Lookup the offset for given millis seconds since 1970-01-01 00:00:00 in given timezone.
+ * TODO: Improve handling of normalization differences.
+ * TODO: Replace with JSR-310 or similar system - see SPARK-16788
*/
- private def getOffsetFromLocalMillis(millisLocal: Long, tz: TimeZone): Long = {
+ private[sql] def getOffsetFromLocalMillis(millisLocal: Long, tz: TimeZone): Long = {
var guess = tz.getRawOffset
// the actual offset should be calculated based on milliseconds in UTC
val offset = tz.getOffset(millisLocal - guess)
@@ -875,11 +877,11 @@ object DateTimeUtils {
val hh = seconds / 3600
val mm = seconds / 60 % 60
val ss = seconds % 60
- val nano = millisOfDay % 1000 * 1000000
-
- // create a Timestamp to get the unix timestamp (in UTC)
- val timestamp = new Timestamp(year - 1900, month - 1, day, hh, mm, ss, nano)
- guess = (millisLocal - timestamp.getTime).toInt
+ val ms = millisOfDay % 1000
+ val calendar = Calendar.getInstance(tz)
+ calendar.set(year, month - 1, day, hh, mm, ss)
+ calendar.set(Calendar.MILLISECOND, ms)
+ guess = (millisLocal - calendar.getTimeInMillis()).toInt
}
}
guess
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 059a5b7d07..4f516d0064 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
@@ -551,7 +551,8 @@ class DateTimeUtilsSuite extends SparkFunSuite {
val skipped = skipped_days.getOrElse(tz.getID, Int.MinValue)
(-20000 to 20000).foreach { d =>
if (d != skipped) {
- assert(millisToDays(daysToMillis(d)) === d)
+ assert(millisToDays(daysToMillis(d)) === d,
+ s"Round trip of ${d} did not work in tz ${tz}")
}
}
}