Skip to content

Commit f8097b4

Browse files
committed
Tests for DateTimeFormatter
1 parent 1ad1184 commit f8097b4

File tree

2 files changed

+78
-10
lines changed

2 files changed

+78
-10
lines changed

sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/util/DateTimeTestUtils.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,16 @@ object DateTimeTestUtils {
2626

2727
val ALL_TIMEZONES: Seq[TimeZone] = TimeZone.getAvailableIDs.toSeq.map(TimeZone.getTimeZone)
2828

29-
val outstandingTimezones: Seq[TimeZone] = Seq(
29+
val outstandingTimezonesIds: Seq[String] = Seq(
3030
"UTC",
3131
"PST",
3232
"CET",
3333
"Africa/Dakar",
3434
"America/Los_Angeles",
3535
"Antarctica/Vostok",
3636
"Asia/Hong_Kong",
37-
"Europe/Amsterdam").map(TimeZone.getTimeZone)
37+
"Europe/Amsterdam")
38+
val outstandingTimezones: Seq[TimeZone] = outstandingTimezonesIds.map(TimeZone.getTimeZone)
3839

3940
def withDefaultTimeZone[T](newDefaultTimeZone: TimeZone)(block: => T): T = {
4041
val originalDefaultTimeZone = TimeZone.getDefault

sql/catalyst/src/test/scala/org/apache/spark/sql/util/DateTimeFormatterSuite.scala

Lines changed: 75 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,87 @@
1717

1818
package org.apache.spark.sql.util
1919

20-
import java.util.Locale
20+
import java.util.{Locale, TimeZone}
2121

2222
import org.apache.spark.SparkFunSuite
2323
import org.apache.spark.sql.catalyst.util.{DateFormatter, DateTimeFormatter, DateTimeTestUtils}
2424

2525
class DateTimeFormatterSuite extends SparkFunSuite {
26+
test("parsing dates using time zones") {
27+
val localDate = "2018-12-02"
28+
val expectedDays = Map(
29+
"UTC" -> 17867,
30+
"PST" -> 17867,
31+
"CET" -> 17866,
32+
"Africa/Dakar" -> 17867,
33+
"America/Los_Angeles" -> 17867,
34+
"Antarctica/Vostok" -> 17866,
35+
"Asia/Hong_Kong" -> 17866,
36+
"Europe/Amsterdam" -> 17866)
37+
DateTimeTestUtils.outstandingTimezonesIds.foreach { timeZone =>
38+
val formatter = DateFormatter("yyyy-MM-dd", TimeZone.getTimeZone(timeZone), Locale.US)
39+
val daysSinceEpoch = formatter.parse(localDate)
40+
assert(daysSinceEpoch === expectedDays(timeZone))
41+
}
42+
}
43+
44+
test("parsing timestamps using time zones") {
45+
val localDate = "2018-12-02T10:11:12.001234"
46+
val expectedMicros = Map(
47+
"UTC" -> 1543745472001234L,
48+
"PST" -> 1543774272001234L,
49+
"CET" -> 1543741872001234L,
50+
"Africa/Dakar" -> 1543745472001234L,
51+
"America/Los_Angeles" -> 1543774272001234L,
52+
"Antarctica/Vostok" -> 1543723872001234L,
53+
"Asia/Hong_Kong" -> 1543716672001234L,
54+
"Europe/Amsterdam" -> 1543741872001234L)
55+
DateTimeTestUtils.outstandingTimezonesIds.foreach { timeZone =>
56+
val formatter = DateTimeFormatter(
57+
"yyyy-MM-dd'T'HH:mm:ss.SSSSSS",
58+
TimeZone.getTimeZone(timeZone),
59+
Locale.US)
60+
val microsSinceEpoch = formatter.parse(localDate)
61+
assert(microsSinceEpoch === expectedMicros(timeZone))
62+
}
63+
}
64+
65+
test("format dates using time zones") {
66+
val daysSinceEpoch = 17867
67+
val expectedDate = Map(
68+
"UTC" -> "2018-12-02",
69+
"PST" -> "2018-12-01",
70+
"CET" -> "2018-12-02",
71+
"Africa/Dakar" -> "2018-12-02",
72+
"America/Los_Angeles" -> "2018-12-01",
73+
"Antarctica/Vostok" -> "2018-12-02",
74+
"Asia/Hong_Kong" -> "2018-12-02",
75+
"Europe/Amsterdam" -> "2018-12-02")
76+
DateTimeTestUtils.outstandingTimezonesIds.foreach { timeZone =>
77+
val formatter = DateFormatter("yyyy-MM-dd", TimeZone.getTimeZone(timeZone), Locale.US)
78+
val date = formatter.format(daysSinceEpoch)
79+
assert(date === expectedDate(timeZone))
80+
}
81+
}
2682

27-
test("roundtrip parsing timestamps using timezones") {
28-
DateTimeTestUtils.outstandingTimezones.foreach { timeZone =>
29-
val timestamp = "2018-12-02T11:22:33.123456"
30-
val formatter = DateTimeFormatter("yyyy-MM-dd'T'HH:mm:ss.SSSSSS", timeZone, Locale.US)
31-
val micros = formatter.parse(timestamp)
32-
val formatted = formatter.format(micros)
33-
assert(timestamp === formatted)
83+
test("format timestamps using time zones") {
84+
val microsSinceEpoch = 1543745472001234L
85+
val expectedTimestamp = Map(
86+
"UTC" -> "2018-12-02T10:11:12.001234",
87+
"PST" -> "2018-12-02T02:11:12.001234",
88+
"CET" -> "2018-12-02T11:11:12.001234",
89+
"Africa/Dakar" -> "2018-12-02T10:11:12.001234",
90+
"America/Los_Angeles" -> "2018-12-02T02:11:12.001234",
91+
"Antarctica/Vostok" -> "2018-12-02T16:11:12.001234",
92+
"Asia/Hong_Kong" -> "2018-12-02T18:11:12.001234",
93+
"Europe/Amsterdam" -> "2018-12-02T11:11:12.001234")
94+
DateTimeTestUtils.outstandingTimezonesIds.foreach { timeZone =>
95+
val formatter = DateTimeFormatter(
96+
"yyyy-MM-dd'T'HH:mm:ss.SSSSSS",
97+
TimeZone.getTimeZone(timeZone),
98+
Locale.US)
99+
val timestamp = formatter.format(microsSinceEpoch)
100+
assert(timestamp === expectedTimestamp(timeZone))
34101
}
35102
}
36103
}

0 commit comments

Comments
 (0)