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

ami*_*mar 2 java datetimeoffset date-formatting java-time

我有一个字符串“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
Run Code Online (Sandbox Code Playgroud)

但是当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)
Run Code Online (Sandbox Code Playgroud)

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

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

谁能帮我一下吗

Lin*_*ica 6

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

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

System.out.println(odt);
Run Code Online (Sandbox Code Playgroud)

然后该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为 a即可。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);
Run Code Online (Sandbox Code Playgroud)

哪个输出:

2020-03-25T22:00:00.000Z
Run Code Online (Sandbox Code Playgroud)