У меня есть некоторый код, подобный этому
import java.time.Instant
val tstamp = 1546344620.1877
val nanoAdj = ((BigDecimal(tstamp) - tstamp.toLong) * 1000000000).toLong
Instant.ofEpochSecond(tstamp.toLong, nanoAdj).toString
// will print : 2019-01-01T12:10:20.187700Z
toString
из объекта Instant, созданного из ofEpochSecond
, отлично подходит с конечными нулями для группы милли / микро / нано, но я изо всех сил стараюсьполучить отформатированный, чтобы сделать то же самое. Мне нужно немного изменить формат на что-то вроде 2019-01-01 12:10:20.187700 UTC
Другие примеры:
2019-01-01 12:10:20 UTC // no fractions
2019-01-01 12:10:20.180 UTC // milliseconds
2019-01-01 12:10:20.187700 UTC // microseconds
2019-01-01 12:10:20.187738200 UTC // nanoseconds
Я использую DateTimeFormatter, как показано ниже, но я открыт для других предложений.
def formatter: DateTimeFormatter = {
val tz_format = new DateTimeFormatterBuilder()
.optionalStart
.parseCaseSensitive()
.appendZoneRegionId()
.toFormatter
val datetime_format = new DateTimeFormatterBuilder()
.appendValue(HOUR_OF_DAY, 2)
.appendLiteral(':')
.appendValue(MINUTE_OF_HOUR, 2)
.optionalStart()
.appendLiteral(':')
.appendValue(SECOND_OF_MINUTE, 2)
.optionalStart()
.appendFraction(NANO_OF_SECOND, 0, 9, true)
.toFormatter
new DateTimeFormatterBuilder()
.parseCaseInsensitive
.append(ISO_LOCAL_DATE)
.appendLiteral(' ')
.append(datetime_format)
.appendLiteral(' ')
.append(tz_format)
.toFormatter
.withZone(ZoneId.of("UTC"))
}