Java DateTime格式设置为尾随零,并捕捉为milli、micro或nano格式
我有一些这样的代码Java DateTime格式设置为尾随零,并捕捉为milli、micro或nano格式,java,scala,Java,Scala,我有一些这样的代码 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 从瞬间对象创建的toS
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
非常棒,从零到毫/微/纳米组,但我正在努力使格式化的对象也这样做。我需要将格式稍微更改为类似于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"))
}
正如Andreas在评论中所说,用于格式化的类,
DateTimeFormatter
,不支持这种漂亮的功能。我最好的建议是利用LocalTime.toString()
,它拥有它。关于Java代码,我很抱歉
private static final DateTimeFormatter dateFormatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd ");
private static String formatEpochSeconds(String epochSeconds) {
BigDecimal totalSeconds = new BigDecimal(epochSeconds);
long seconds = totalSeconds.longValue();
long nanos = totalSeconds.subtract(new BigDecimal(seconds))
.multiply(new BigDecimal(TimeUnit.SECONDS.toNanos(1)))
.longValue();
OffsetDateTime dateTime = Instant.ofEpochSecond(seconds, nanos)
.atOffset(ZoneOffset.UTC);
return dateTime.format(dateFormatter)
+ dateTime.toLocalTime()
+ " UTC";
}
试一试:
System.out.println(formatEpochSeconds("1546344600.0"));
System.out.println(formatEpochSeconds("1546344620.0"));
System.out.println(formatEpochSeconds("1546344620.18"));
System.out.println(formatEpochSeconds("1546344620.1877"));
System.out.println(formatEpochSeconds("1546344620.1877382"));
输出为:
请注意,如果秒数为0.0,则会完全忽略。如果您不想这样做,您需要编写一个特殊情况的代码。不幸的是,
DateTimeFormatter
不支持这种情况,而且因为它是final
,所以您甚至不能用这样的功能扩展它。@Andreas任何其他可以完成此工作的格式化程序?只有一个是您自己编写的。我建议编写一个格式化程序,使用带有9个小数位数的DateTimeFormatter
,然后在0时以3块的形式删除,例如使用正则表达式。据我所知,双输入可以精确表示微秒,而纳秒在任何情况下都将被舍入。。。那你为什么要用BigDecimal
而不是(tstamp-tstamp.toLong)*100000000
来计算纳米调整呢?顺便说一句,我能为你提供最有效的解决方案,但只是好奇哪个系统/库/框架为你提供了双倍的时间戳?
2019-01-01 12:10 UTC
2019-01-01 12:10:20 UTC
2019-01-01 12:10:20.180 UTC
2019-01-01 12:10:20.187700 UTC
2019-01-01 12:10:20.187738200 UTC