Мне нужно взаимодействовать с базой данных, поэтому я использую ZonedDateTime для преобразования между отметкой времени sql и моментальной, но, похоже, я не могу заставить ее работать. Я видел другие решения, которые включают преобразование временной метки сначала в «LocalDate» или «LocalDateTime», а затем в «ZonedDateTime», но мой конвертер должен быть в состоянии принять либо; Мне не нужно явно указывать, в какую из них я хочу преобразовать метку времени. Любые советы по написанию универсального конвертера меток времени? Код здесь:
class ConvertTimestamp(form: String, parser: DateTimeFormatter) extends ObjectConversion[Any] with FormattedConversion[DateTimeFormatter] {
def this(form: String) = this(form, DateTimeFormatter.ofPattern(form).withZone(ZoneOffset.UTC))
def execute(input: String): Timestamp = {
val timeStamp = parsers.iterator
.map( f => {
val zdt = ZonedDateTime.parse(input, f)
Try(Timestamp.from(zdt.toInstant))
})
.find(_.isSuccess)
.flatMap(._toOption)
timeStamp getOrElse { throw new Exception("Can't parse")
def parsers: Array[DateTimeFormatter] = Array(parser)
}
И пример вызова:
new ConvertTimestamp("YYYY-MM-dd HH:mm:ss").execute("2000-01-01 12:00:00")
, который должен равняться
Timestamp.valueOf(LocalDateTime.parse("2000-01-01T12:00:00"))
но этот вызов завершается с
java.time.format.DateTimeParseException: Text '2000-01-01 12:00:00' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {DayOfMonth=1, WeekBasedYear[WeekFields[SUNDAY,1]]=2000, MonthOfYear=1},ISO,Z resolved to 12:00 of type java.time.format.Parsedd