diff --git a/src/main/scala/fetch/lvgmc/WaterTemperatureService.scala b/src/main/scala/fetch/lvgmc/WaterTemperatureService.scala index 505c218..d83ca48 100644 --- a/src/main/scala/fetch/lvgmc/WaterTemperatureService.scala +++ b/src/main/scala/fetch/lvgmc/WaterTemperatureService.scala @@ -9,7 +9,7 @@ import org.http4s.ember.client.EmberClientBuilder import org.typelevel.log4cats.Logger import org.typelevel.log4cats.slf4j.Slf4jLogger -import java.time.{Duration, Instant, LocalDateTime} +import java.time.{Duration, Instant, LocalDateTime, ZoneId, ZoneOffset} import scala.util.Try final case class WaterTemperatureReading(area: String, observedAt: String, min: Option[Double], max: Option[Double]) @@ -43,6 +43,15 @@ final class WaterTemperatureService private (logger: Logger[IO], cache: Ref[IO, private val areaOrder: Vector[String] = Vector("Jūra", "Līcis", "Kurzeme", "Zemgale", "Vidzeme", "Latgale") + // This dataset's DATETIME field is UTC (same source/portal as the station + // observations feed, same verified offset); converted to local so the + // observedAt label shown on Ūdens matches the newsroom's own clock instead + // of reading 2-3h behind. + private val rigaZone = ZoneId.of("Europe/Riga") + + private def toLocal(utcDatetime: String): Option[String] = + Try(LocalDateTime.parse(utcDatetime).atZone(ZoneOffset.UTC).withZoneSameInstant(rigaZone).toLocalDateTime.toString).toOption + // Every LVĢMC hydrological station that reports water temperature (WTEMD // inland/river stations, SEDUT coastal stations), grouped into the six // named Ūdens zones. Boundaries follow Latvia's historical regions @@ -177,7 +186,8 @@ final class WaterTemperatureService private (logger: Logger[IO], cache: Ref[IO, val cursor = row.hcursor for { stationId <- cursor.downField("STATION_ID").as[String].toOption - datetime <- cursor.downField("DATETIME").as[String].toOption + rawDatetime <- cursor.downField("DATETIME").as[String].toOption + datetime <- toLocal(rawDatetime) value <- cursor.downField("VALUE").as[Double].toOption } yield StationReading(stationId, datetime, value) }