Search code examples
javascalajodatime

Joda LocalDateTime from LocalDate and string


I have:

  • a joda LocalDate, so it has no time information and just date
  • a string which contains time and zone information, like "14:20 CEST"

Either of them can be absent (Scala's Option).

How can I combine these two to get joda LocalDateTime, i.e. entity representing only date and time with no timezone?


Solution

  • To combine these 2 options, the natural way is to use flatMap method like this:

    val onlyDateOption: Option[LocalDate] = ???
    val timeAndZoneOption: Option[String] = ???
    
    val result: Option[LocalDateTime] = onlyDateOption.flatMap { onlyDate => 
      timeAndZoneOption.map { timeAndZone =>
        // Some logic here to build the LocalDateTime from onlyDate and timeAndZone
      }
    }
    

    Which can also be written with for-comprehension in more readible way:

    val result: Option[LocalDateTime] =  for {
      onlyDate <- onlyDateOption
      timeAndZone <- timeAndZoneOption
    } yield { 
      // Some logic here to build the LocalDateTime from onlyDate and timeAndZone
    }
    

    Now, how to use Joda to build what you're expecting can probably be done in various different ways, one could be:

    onlyDate
      .toLocalDateTime(LocalTime.MIDNIGHT)
      .withHourOfDay(...) // hour extracted from the string somehow
      .withMinuteOfHour(...) // minute extracted from the string somehow
    

    I'm not familiar with Joda API, there is probably another easier way