ISO 8601 DateTimeFormatter 截断此格式的毫秒数:'YYYY-MM-DDTHH:mm:ss.sssZ'
ISO 8601 DateTimeFormatter truncates the ms of this format:'YYYY-MM-DDTHH:mm:ss.sssZ'
在线 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。
使用您自己的格式而不是 ISO_DATE_TIME 怎么样?
查看 DateTimeFormatterBuilder 如何以所需的精度构建您自己的格式。
顺便说一句,您使用的格式不会截断“最后一个 0”,只是不显示毫秒...
您可以使用自己的 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
不用担心
LocalDateTime
和 ZonedDateTime
始终具有纳秒精度。所以毫秒并没有消失,它们只是零。并且当它们为零时不会从 toString()
打印出来。
编辑:我从您的评论中了解到以下段落不适用于您的情况。我让它代表可能对它有用的其他人。您很可能不需要担心。您的 API 需要 ISO 8601 格式。在 ISO 8601 中,毫秒(和更小的)为零时是可选的。大多数 API 接受 ISO 8601(以及我遇到的所有),也接受没有毫秒的字符串。
链接
相关问题:
- java.time.format.DateTimeParseException: Text '2021-02-19T00:45:09.798Z' could not be parsed, unparsed text found at index 23 [duplicate] 模式字母
Z
- String to ZonedDateTime is changing format
和中央link:
在线 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。
使用您自己的格式而不是 ISO_DATE_TIME 怎么样?
查看 DateTimeFormatterBuilder 如何以所需的精度构建您自己的格式。
顺便说一句,您使用的格式不会截断“最后一个 0”,只是不显示毫秒...
您可以使用自己的 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
不用担心
LocalDateTime
和 ZonedDateTime
始终具有纳秒精度。所以毫秒并没有消失,它们只是零。并且当它们为零时不会从 toString()
打印出来。
编辑:我从您的评论中了解到以下段落不适用于您的情况。我让它代表可能对它有用的其他人。您很可能不需要担心。您的 API 需要 ISO 8601 格式。在 ISO 8601 中,毫秒(和更小的)为零时是可选的。大多数 API 接受 ISO 8601(以及我遇到的所有),也接受没有毫秒的字符串。
链接
相关问题:
- java.time.format.DateTimeParseException: Text '2021-02-19T00:45:09.798Z' could not be parsed, unparsed text found at index 23 [duplicate] 模式字母
Z
- String to ZonedDateTime is changing format
和中央link: