Dealing with Daylight Saving Time in Scala/Java

Handing daylight saving time programmatically can be tricky. It could create a mini Y2K problem twice a year when done incorrectly.

If you want to get the current LocalDateTime in a different time zone, the best approach is to use an Instant and then convert it to a ZonedDateTime. Use ZonedDateTime.toLocalDateTime to extract the LocalDateTime part of this date-time.

The example below shows how clocks were turned forward and backward an hour in java.time during DST changes in 2022.

import java.time.{ZoneId, ZonedDateTime, LocalDateTime, Instant}
import java.time.temporal.ChronoUnit

val halfAnHourBeforeDstStarted = Instant.parse("2022-03-13T07:30:00.00Z")
val halfAnHourBeforeDstEnds = Instant.parse("2022-11-06T06:30:00.00Z")

/*
Mar 13, 2022 - Daylight Saving Time Started
Sunday, March 13, 2022, 2:00:00 am clocks were turned forward 1 hour to
Sunday, March 13, 2022, 3:00:00 am local daylight time instead.
 */
halfAnHourBeforeDstStarted.atZone(ZoneId.of("US/Central")).toLocalDateTime
// = 2022-03-13T01:30
halfAnHourBeforeDstStarted
  .plus(1, ChronoUnit.HOURS)
  .atZone(ZoneId.of("US/Central"))
  .toLocalDateTime
// = 2022-03-13T03:30

/*
Nov 6, 2022 - Daylight Saving Time Ends
Sunday, November 6, 2022, 2:00:00 am clocks are turned backward 1 hour to
Sunday, November 6, 2022, 1:00:00 am local standard time instead.
 */
halfAnHourBeforeDstEnds.atZone(ZoneId.of("US/Central")).toLocalDateTime
// = 2022-11-06T01:30
halfAnHourBeforeDstEnds
  .plus(1, ChronoUnit.HOURS)
  .atZone(ZoneId.of("US/Central"))
  .toLocalDateTime
// = 2022-11-06T01:30

reference: timeanddate.com/time/change/usa