Преобразуйте TemporalAccessor в java.sql.Timestamp с DateTimeFormatter - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь преобразовать общий ввод в java.sqlTimestamp, используя Java 8 time API, DateTimeFormatter. Вход может выглядеть как LocalTime, LocalDate, LocalDateTime, OffsetDateTime, ZonedDateTime и т. Д. ... в любой форме, но у меня возникают проблемы с получением миллисекундного представления универсального временного метода доступа.

В Java 7 SimpleDateFormat вы могли бы просто иметь класс, который выглядит так

import java.sql.Timestamp
import java.time._
import java.text.SimpleDateFormat

import scala.util.{Failure, Success, Try}

class MyTimeFormatter(parser: SimpleDateFormat) {

  def parse(input: String): Try[Timestamp] = {
    Try(new Timestamp(parser.parse(input).getTime))
  }
}

и работает нормально, называя это так:

new MyTimeFormatter(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS")).parse("2019-01-22T13:09:54.620") shouldEqual Timestamp.valueOf("2019-01-22T13:09:54.620")

Однако в DateTimeFormatter вы не можете просто вызвать .getTime, и вместо этого у меня есть такой код:

import java.sql.Timestamp
import java.time._
import java.time.format.DateTimeFormatter

import scala.util.{Failure, Success, Try}

class MyTimeFormatter(parser: DateTimeFormatter) {

   def parse(input: String): Try[Timestamp] = {  
  Try(Timestamp.valueOf(Instant.from(parser.parse(input)).atZone(ZoneOffset.UTC).toLocalDateTime))
  }
}

Я называю свой код так

new MyTimeFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSxxx")).parse("2019-01-22T13:09:54.620-05:00") shouldEqual Timestamp.valueOf("2019-01-22T18:09:54.620")

Это работает для отметок времени, которые могут быть связаны с моментом на временной шкале, например OffsetDateTime и ZonedDateTime, но не удается для LocalDateTime, например 2017-01-01 12:45:00.000, с исключением java.time.DateTimeException: Unable to obtain Instant from TemporalAccessor: {DayOfMonth=1, MonthOfYear=1, WeekBasedYear[WeekFields[SUNDAY,1]]=2017},ISO,Z resolved to 12:45 of type java.time.format.Parsed, поскольку LocalDateTime не представляет определенное время в истории, в отличие от Мгновенного.

Я не слишком уверен, как написать синтаксический анализатор, который может анализировать любую общую строку метки времени.

...