Использование DateTimeFormatter для любого общего ввода - PullRequest
0 голосов
/ 16 января 2019

Мне нужно взаимодействовать с базой данных, поэтому я использую 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...