【发布时间】:2019-06-16 06:42:13
【问题描述】:
我正在尝试使用 Java 8 DateTimeFormatter 解析偏移时间。
我生活在美国东部标准时间 UTC-5,所以当我尝试转换时
2019-01-22T13:09:54.620-05:00 应该是 --> 2019-01-22T18:09:54.620
但是,使用我的代码,它获取当前时间并返回 5 小时,结果为 2019-01-22 08:09:54.620
代码:
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(new Timestamp(Instant.from(parser.withZone(ZoneOffset.UTC).parse(input)).toEpochMilli))
}
}
测试:
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")
解析器的类型为DateTimeFormatter,输入字符串只是"2019-01-22T13:09:54.620-05:00"
我想使用这个 parser.parse 方法,而不是像 OffsetDateTime.parse(input, parser) 这样的特定 temporalAccessors,所以我可以处理像 LocalTime, LocalDateTime, ZonedDateTime, OffsetDateTime, etc.. 这样的所有情况
似乎代码只是获取时间,减去偏移量,并将其标记为 UTC,而不是计算相对于 UTC 的偏移量。
另外,只有当输入格式为 ZonedDateTime/OffsetDateTime 格式时,是否有办法应用此 UTC 转换?如果我输入一个 LocalDateTime(没有偏移量),例如 2017-01-01 12:45:00,解析器仍将应用 UTC 偏移量转换,因为我告诉解析器使用区域 UTC 进行解析。
【问题讨论】:
-
一个完整的工作示例更有可能得到答案。
-
@TravisBrown 添加了一个示例
标签: java scala datetime-format