2

在线 API 需要这种格式:

string

completion formatted as ISO 8601 timestamp - 'YYYY-MM-DDTHH:mm:ss.sssZ'
2018-11-21T22:38:15.000Z

我试图在中午获得任何 LocalDate 以满足要求,但是,当 Java 查看中午或一天的开始时,它会截断亚秒。例如:

DateTimeFormatter.ISO_DATE_TIME
                    .withZone(ZoneOffset.UTC)
                    .format(LocalDate.now().atTime(LocalTime.NOON).atZone(ZoneOffset.UTC))

产生:

2021-03-08T12:00:00Z

api需要亚秒级。有没有办法让我强制精确?

我尝试构建一个:

DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ") 但输出中缺少 Z。

4

3 回答 3

3

您可以使用自己的DateTimeFormatter

private static final DateTimeFormatter DTF = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX");

然后用它来格式化你的日期:

ZonedDateTime zdt = LocalDate.now().atTime(LocalTime.NOON).atZone(ZoneOffset.UTC);
String formatted = DTF.format(zdt);
System.out.println(formatted); // 2021-03-08T12:00:00.000Z
于 2021-03-08T16:19:14.900 回答
1

使用您自己的格式而不是 ISO_DATE_TIME 怎么样?

看看DateTimeFormatterBuilder如何以所需的精度构建您自己的格式。

顺便说一句,您使用的格式不会截断“最后一个 0”,只是不显示毫秒......

于 2021-03-08T16:16:14.713 回答
0

不用担心

LocalDateTimeZonedDateTime始终具有纳秒级精度。所以毫秒并没有消失,它们只是零。并且不会从toString()它们为零时开始打印。

编辑:我从您的评论中了解到,以下段落不适用于您的情况。我让它代表可能对它有用的其他人。你很可能不需要担心。您的 API 需要 ISO 8601 格式。在 ISO 8601 中,毫秒(或更小)在为零时是可选的。大多数接受 ISO 8601(以及我遇到的所有 API)的 API 也接受不带毫秒的字符串。

链接

相关问题:

和中心链接:

于 2021-03-09T17:15:37.510 回答