使用DateTimeFormatter将TemporalAccessor转换为java.sql.Timestamp

时间:2019-01-22 19:20:32

标签: java scala datetime-format

我正在尝试使用Java 8时间API DateTimeFormatter将通用输入转换为java.sqlTimestamp。输入看起来像 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")

这适用于可能与时间轴中的瞬间相关的时间戳,例如OffsetDateTimeZonedDateTime,但对于LocalDateTime这样的时间戳,例如2017-01-01 12:45:00.000,则例外,{{ 1}},因为与Instant不同,LocalDateTime不代表历史记录中的特定时间。

我不太确定如何编写一个可以解析任何通用时间戳记字符串的解析器。

0 个答案:

没有答案