【问题标题】:ISO 8601 DateTimeFormatter truncates the ms of this format:'YYYY-MM-DDTHH:mm:ss.sssZ'ISO 8601 DateTimeFormatter 截断此格式的毫秒:'YYYY-MM-DDTHH:mm:ss.sssZ'
【发布时间】:2021-06-06 12:51:21
【问题描述】:

在线 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。

【问题讨论】:

  • s 仍然是秒,而不是毫秒,因为你把它放在点之后。你的意思是SSS
  • 在 Java 中,是的,但他们说的是毫秒。
  • 更新了我的评论,我想现在更清楚了
  • 我正在使用 ISO_DATE_TIME 的内置格式化程序。它适用于任何其他时间。
  • 嗯,您可以随时提供自己的时间格式。

标签: java datetime java-time zoneddatetime datetimeformatter


【解决方案1】:

您可以使用自己的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

【讨论】:

  • 我确实尝试过创建一个...但是您使用的是小写 Z ...它可能会解决我的问题...我会尝试
  • 你能解释一下 z 和 X 的区别吗?
  • @trilogy 在您的情况下并没有什么不同。 z 打印时区名称,而X 将使用类似-08; -0830; -08:30; 的值,但UTC 除外,它只是打印Z
  • 我们也应该使用 'u' 而不是 'y' 吗?
  • @trilogy 你不应该关心u,除非你使用年份之前的日期0
【解决方案2】:

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

请查看DateTimeFormatterBuilder,了解如何以所需的精度构建您自己的格式。

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

【讨论】:

  • 我尝试构建一个,但缺少 Z DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ 它提供了一个 +00 的偏移量
  • “Z”是时区(“祖鲁时间”或 UTC)。并且不要使用DateTimeFormatter.ofPattern(),使用DateTimeFormatterBuilder ...
  • 我知道 Z 是什么意思.. 但是 api 特别想要输出中的 Z。这是一个 UTC 日期。
  • @tquadrat 为什么不使用ofPattern 方法?使用builder有什么好处?
  • @Lino – 构建器为您提供更多控制权,在 this 情况下有什么帮助。但总的来说,当您确定模式时,您也可以使用ofPattern() 方法。特别是对于时区的东西,这种模式有时……很困难。
【解决方案3】:

不用担心

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

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

链接

相关问题:

以及中心链接:

【讨论】:

  • 我确实看过 Wiki 文章。我最初认为该公司没有通过强制执行该问题来遵循 ISO 8601,但后来我在其中读到:“但是,小数位数需要得到通信方的同意。”...... API 拒绝了任何更少的东西小数点后 3 位...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 2017-03-22
相关资源
最近更新 更多