Explicitly set time zone Make sure timezone is always set to UTC when formatting dates. Feature: Issue 9872 Change-Id: Ibb54fe2994cb1b10699b0dd62115d4869eb70bd0
diff --git a/src/main/scala/com/gerritforge/analytics/support/ops/AnalyticsTimeOps.scala b/src/main/scala/com/gerritforge/analytics/support/ops/AnalyticsTimeOps.scala index 6cb59d0..9012617 100644 --- a/src/main/scala/com/gerritforge/analytics/support/ops/AnalyticsTimeOps.scala +++ b/src/main/scala/com/gerritforge/analytics/support/ops/AnalyticsTimeOps.scala
@@ -23,19 +23,25 @@ import java.sql.Timestamp import java.text.SimpleDateFormat import java.time.{Instant, LocalDate, OffsetDateTime} + import java.util.TimeZone import scala.util.Try - object AnalyticsDateTimeFormater { val yyyy_MM_dd_HHmmss_SSSSSSSSS: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSSS") val yyyy_MM_dd: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") - val yyyyMMddHH: SimpleDateFormat = new SimpleDateFormat("yyyyMMddHH") - val yyyyMMdd: SimpleDateFormat = new SimpleDateFormat("yyyyMMdd") - val yyyyMM: SimpleDateFormat = new SimpleDateFormat("yyyyMM") - val yyyy: SimpleDateFormat = new SimpleDateFormat("yyyy") + val yyyyMMddHH: SimpleDateFormat = buildSimpleDateFormatUTC("yyyyMMddHH") + val yyyyMMdd: SimpleDateFormat= buildSimpleDateFormatUTC("yyyyMMdd") + val yyyyMM: SimpleDateFormat = buildSimpleDateFormatUTC("yyyyMM") + val yyyy: SimpleDateFormat = buildSimpleDateFormatUTC("yyyy") + + private def buildSimpleDateFormatUTC(pattern: String): SimpleDateFormat = { + val simpleDateFormat = new SimpleDateFormat(pattern) + simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC")) + simpleDateFormat + } } object CommonTimeOperations {
diff --git a/src/test/scala/com/gerritforge/analytics/support/ops/AnalyticsTimeOpsSpec.scala b/src/test/scala/com/gerritforge/analytics/support/ops/AnalyticsTimeOpsSpec.scala index c76efdb..1c9adb8 100644 --- a/src/test/scala/com/gerritforge/analytics/support/ops/AnalyticsTimeOpsSpec.scala +++ b/src/test/scala/com/gerritforge/analytics/support/ops/AnalyticsTimeOpsSpec.scala
@@ -59,8 +59,7 @@ } - "Simple Date Formats" should "convert to the correct strings" in { - + "Simple Date Formats" should "convert to the correct strings - yyyyMMddHH" in { val epochValueUTC = LocalDateTime .of(2018, 1, 1, 12, 0, 0, 0) @@ -68,13 +67,39 @@ .toInstant.toEpochMilli val yyyyMMddHHStr = "2018010112" - val yyyyMMddStr = "20180101" - val yyyyMMStr = "201801" - val yyyyStr = "2018" - AnalyticsDateTimeFormater.yyyyMMddHH.format(epochValueUTC) should equal(yyyyMMddHHStr) + } + + it should "convert to the correct strings - yyyyMMdd" in { + val epochValueUTC = + LocalDateTime + .of(2018, 1, 1, 12, 0, 0, 0) + .atOffset(ZoneOffset.UTC) + .toInstant.toEpochMilli + + val yyyyMMddStr = "20180101" AnalyticsDateTimeFormater.yyyyMMdd.format(epochValueUTC) should equal(yyyyMMddStr) + } + + it should "convert to the correct strings - yyyyMM" in { + val epochValueUTC = + LocalDateTime + .of(2018, 1, 1, 12, 0, 0, 0) + .atOffset(ZoneOffset.UTC) + .toInstant.toEpochMilli + + val yyyyMMStr = "201801" AnalyticsDateTimeFormater.yyyyMM.format(epochValueUTC) should equal(yyyyMMStr) + } + + it should "convert to the correct strings - yyyy" in { + val epochValueUTC = + LocalDateTime + .of(2018, 1, 1, 12, 0, 0, 0) + .atOffset(ZoneOffset.UTC) + .toInstant.toEpochMilli + + val yyyyStr = "2018" AnalyticsDateTimeFormater.yyyy.format(epochValueUTC) should equal(yyyyStr) }