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