问题 具有固定毫位数的java.time ISO日期格式(在Java 8及更高版本中)


默认情况下 toString 的方法 Instant 使用 DateTimeFormatter.ISO_INSTANT 格式化。如果格式化程序碰巧为0,则不会打印秒数的数字。

Java的时间 例子:

    2015-10-08T17:13:07.589Z
    2015-10-08T17:13:07Z

乔达时间 示例(以及我对java.time的期望):

    2015-10-08T17:13:07.589Z
    2015-10-08T17:13:07.000Z

在一些系统中解析这真的很令人沮丧。 Elasticsearch 是我遇到的第一个问题,没有预定义的格式支持可选的millis,但我可以使用自定义格式解决这个问题。默认似乎是错误的。

看来你无法为Instants构建自己的格式字符串。是实现我自己的java.time.format.DateTimeFormatterBuilder.InstantPrinterParser的唯一选项吗?


6897
2017-10-08 21:09


起源

您的目标是找到日期是否具有毫秒精度? - Sotirios Delimanolis
目标是使用小数第二部分格式化该日期,即使这些毫秒等于0.换句话说,模仿Joda所做的事情。 - Ed Thomas
快速提醒:java.time提供了分辨率 纳秒,而不是Joda-Time和java.util.Date的毫秒分辨率。这意味着最多九(9)个小数秒。因此,如果限制为3,则可能隐藏/丢失数据。看到 我的这张图。 - Basil Bourque


答案:


只需创建一个 DateTimeFormatter 保留三个小数位数。

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendInstant(3).toFormatter();

然后使用它。例如:

System.out.println(formatter.format(Instant.now()));
System.out.println(formatter.format(Instant.now().truncatedTo(ChronoUnit.SECONDS)));

...打印(当我运行它):

2015-10-08T21:26:16.571Z
2015-10-08T21:26:16.000Z

摘录了 班级文件

... fractionalDigits参数允许控制小数秒的输出。指定零将导致不输出小数位。如果需要,从1到9将输出越来越多的数字,使用零右边填充。特殊值-1用于输出必要的数字以避免任何尾随零。 ...


9
2017-10-08 21:27