|
17 | 17 |
|
18 | 18 | package org.apache.spark.sql.util
|
19 | 19 |
|
20 |
| -import java.util.Locale |
| 20 | +import java.util.{Locale, TimeZone} |
21 | 21 |
|
22 | 22 | import org.apache.spark.SparkFunSuite
|
23 | 23 | import org.apache.spark.sql.catalyst.util.{DateFormatter, DateTimeFormatter, DateTimeTestUtils}
|
24 | 24 |
|
25 | 25 | 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 | + } |
26 | 82 |
|
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)) |
34 | 101 | }
|
35 | 102 | }
|
36 | 103 | }
|
0 commit comments