问题在于您的格式不能完全代表即时消息,因为您的格式根本没有几分钟的代表。格式化程序可以正确地使用Instant并以您的格式输出结果,因为Instant具有您格式所需的所有数据,但是您的格式不具备Instant所需的所有数据。
尝试将模式更改为
yyyyMMdd kk:HH:mm:ss.SSS,您将看到代码现在可以工作了。请注意添加
mm。
如果绝对需要无缝模式,则应进行自己的TemporalQuery来从TemporalAccessor中提取所需的信息。在这种情况下,我只需将分钟设置为
0:
public class MyQuery implements TemporalQuery<Instant> { @Override public Instant queryFrom(TemporalAccessor temporal) { LocalDate ld = LocalDate.from(temporal); LocalTime lt = LocalTime.of(temporal.get(ChronoField.HOUR_OF_DAY), 0, temporal.get(ChronoField.SECOND_OF_MINUTE), temporal.get(ChronoField.NANO_OF_SECOND)); return ZonedDateTime.of(ld, lt, ZoneId.systemDefault()).toInstant(); }}然后,我们可以像下面这样使用TemporalQuery:
public class Test { public static void main(String[] args) { DateTimeFormatter formatter = DateTimeFormatter .ofPattern("yyyyMMdd kk:HH:mm:ss.SSS") .withLocale(Locale.getDefault()) .withZone(ZoneId.systemDefault()); Instant now = Instant.now(); String formatted = formatter.format(now); System.out.println(formatted); Instant ld = formatter.parse(formatted, new MyQuery()); }}


