如果字符串包含000,则OffsetDateTime不显示毫秒

我有一个字符串“ 2020-03-25T22:00:00.000Z”,我想将其转换为OffsetDateTime。 下面是我尝试的代码,但是当我将毫秒传递为000时,它没有反映在OffsetDateTime中。

OffsetDateTime offsetDateTime=OffsetDateTime.parse("2020-03-25T22:00:01.123Z",DateTimeFormatter.ISO_OFFSET_DATE_TIME);
print(offsetDateTime)
//Output: 2020-03-25T22:00:01.123Z

但是当mili是000时

OffsetDateTime offsetDateTime=OffsetDateTime.parse("2020-03-25T22:00:01.000Z",DateTimeFormatter.ISO_OFFSET_DATE_TIME);
print(offsetDateTime)

//Output: 2020-03-25T22:01Z (mili second is missing)

我也尝试过自定义格式化程序,但是它的行为相同

OffsetDateTime.parse("2020-03-25T22:00:00.123Z",DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX"));

有人可以帮我吗

iCMS 回答:如果字符串包含000,则OffsetDateTime不显示毫秒

您必须记住,用于解析ISO-String的格式可能与用于将日期时间对象转换回String的格式不同。

当您像这样打印偏移日期时间时:

System.out.println(odt);

然后将调用OffsetDateTime.toString()方法,并从其文档中调用该方法:

将此日期时间输出为字符串,例如2007-12-03T10:15:30 + 01:00。 输出将是以下ISO-8601格式之一:

  • uuuu-MM-dd'T'HH:mmXXXXX
  • uuuu-MM-dd'T'HH:mm:ssXXXXX
  • uuuu-MM-dd'T'HH:mm:ss.SSSXXXXX
  • uuuu-MM-dd'T'HH:mm:ss.SSSSSSXXXXX
  • uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSSXXXXX

所使用的格式将是最短的格式,用于输出被省略部分隐含为零的时间的完整值。

同样,请记住,java.time包中的任何类都不会具有格式,所有这些类都包含一些表示毫秒或天等的long字段。

我可能对此不太强调,但这是处理日期和时间时的要点:java.time没有具有格式,您需要转换转换为适当的格式。

因此,如果您始终想拥有全部价值,那么只需在打印之前将OffsetDateTime格式化为String

// best is to store that in a static variable
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX");

// parse using our custom formatter
OffsetDateTime odt = OffsetDateTime.parse("2020-03-25T22:00:00.000Z",dtf);

// print using our custom formatter
String formatted = odt.format(dtf);
System.out.println(formatted);

哪个输出:

2020-03-25T22:00:00.000Z
,

前段时间我遇到了同样的问题,并且 Jackson 模块GitHub页面上实际上有一个开放线程:https://github.com/FasterXML/jackson-modules-java8/issues/76

从该线程可以看到,这似乎是Jackson模块本身设计中的问题。

您不必担心缺少毫秒。我认为,它的目的是在ISO字符串中省略尾随零,以节省时间和内存。

我认为这应该是可自定义的行为。

您可以在这里找到完全相同的问题: https://stackoverflow.com/a/52191521/4697963

值得一看并阅读该线程。

本文链接:https://www.f2er.com/1940655.html

大家都在问