Java 11 ZonedDateTime - 打印格式

Java 11 ZonedDateTime - Print Format

提问人:Ademir Constantino 提问时间:11/17/2023 最后编辑:Ademir Constantino 更新时间:11/17/2023 访问量:98

问:

如何使用 Java 11 中的 ZonedDateTime 对象获得 2023-11-16T09:54:12.123 的结果?

我写道:

zdt.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)

并得到ISO_LOCAL_DATE_TIME: 2023-11-16T17:25:27.1881768

我想删除只有三位数的纳秒。

Java 日期格式 zoneddatetime

评论


答:

0赞 Laurent Schoelens 11/17/2023 #1

您可以将该方法用于构造良好的对象。java.time.ZonedDateTime.format(DateTimeFormatter)java.time.format.DateTimeFormatter

您可以使用静态方法构造对象,但查看示例输出,应该可以完成这项工作DateTimeFormatterofPatternjava.time.format.DateTimeFormatter.ISO_LOCAL_DATE_TIME

另一点是:这个类是线程安全的,所以你可以安全地用你想要的良好输出模式声明一个静态类字段。对于像 这样的上一个日期格式化程序,情况并非如此。DateTimeFormatterjava.text.SimpleDateFormat

评论

0赞 Ademir Constantino 11/17/2023
我写了 zdt.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) 并得到ISO_LOCAL_DATE_TIME: 2023-11-16T17:25:27.1881768 我希望 TIMESTAMP 只有三位数字,不包括纳秒。
1赞 f1sh 11/17/2023
然后,@AdemirConstantino看看ISO_LOCAL_DATE_TIME背后的模式,并使用没有纳秒的模式。
1赞 Laurent Schoelens 11/17/2023
对于 2023-11-16T17:25:27.188,请尝试 .您可以在此处查看 javadoc 以获取更多模式和字母的含义:docs.oracle.com/javase/8/docs/api/java/time/format/...uuuu-MM-dd'T'HH:mm:ss.SSS
5赞 k314159 11/17/2023 #2

有两种方法可以做到这一点:

  1. 使用 ISO_LOCAL_DATE_TIME,但将时间截断为毫秒:
zdt.truncatedTo(ChronoUnit.MILLIS)
        .format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
  1. 使用自定义格式化程序并保持时间不变:
private static final var ldtMillisFormatter =
        DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSS");
...
zdt.format(ldtMillisFormatter)
4赞 Reilas 11/17/2023 #3

"...如何使用 Java 11 中的 ZonedDateTime 对象获得 2023-11-16T09:54:12.123 的结果?..."

您可以手动输入值。
格式说明符的列表可以在 JavaDoc 中找到 DateTimeFormatter

同样,ISO 8601 的大纲可以在维基百科上找到。
维基百科 – ISO_8601

ZonedDateTime z = ZonedDateTime.now();
DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
String s = z.format(f);

或者,使用 DateTimeFormatterBuilder 类。

ZonedDateTime z = ZonedDateTime.now();
DateTimeFormatterBuilder f
    = new DateTimeFormatterBuilder()
        .append(DateTimeFormatter.ISO_LOCAL_DATE)
        .appendLiteral('T')
        .appendValue(ChronoField.HOUR_OF_DAY, 2)
        .appendLiteral(':')
        .appendValue(ChronoField.MINUTE_OF_HOUR, 2)
        .appendLiteral(':')
        .appendValue(ChronoField.SECOND_OF_MINUTE, 2)
        .appendLiteral('.')
        .appendValue(ChronoField.MILLI_OF_SECOND, 3);
String s = z.format(f.toFormatter());

输出

2023-11-16T13:02:51.753