aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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}")
}
}
}