ZonedDateTime 忽略 ss 部分的 00

sor*_*rab 2 java datetime-format seconds datetime-parsing zoneddatetime

我正在尝试转换字符串值“2018-10-11T12:00:00Z”;到 ZonedDateTime。如果我使用默认的 ZonedDateTime.parse(zonedDateTime) ,则 ss 部分即 00 被删除,并且我得到“2018-10-11T12:00Z”作为输出。

您能帮忙如何保留 00 作为 SS 部分吗?

String zonedDateTime = "2018-10-11T12:00:00Z";

ZonedDateTime z =  ZonedDateTime.parse(zonedDateTime);
System.out.println(z);  // return 2018-10-11T12:00Z

ZonedDateTime z1 =  ZonedDateTime.parse (zonedDateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ") );

System.out.println(z1);  // Exception : Text '2018-10-11T12:00:00Z' could not be parsed at index 19
Run Code Online (Sandbox Code Playgroud)

Ole*_*.V. 6

打印秒数

\n\n

当您只打印ZonedDateTimeusing时System.out.println,您就隐式调用了它的toString方法。当秒和秒的小数部分为 0 时,toString将其忽略。无论如何,要打印它们,请使用格式化程序进行格式化(而不是使用格式化程序进行解析):

\n\n
    DateTimeFormatter formatterWithSeconds = DateTimeFormatter.ofPattern("uuuu-MM-dd\'T\'HH:mm:ssXXX");\n    System.out.println("z with seconds: " + z.format(formatterWithSeconds));\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出是:

\n\n
\n

z 带秒:2018-10-11T12:00:00Z

\n
\n\n

这里的重要区别是ZonedDateTime对象及其字符串表示形式之间的区别。该ZonedDateTime对象始终包含秒和纳秒,即使它们为 0。字符串表示形式可能包含也可能不包含它们。one-argZonedDateTime.parse已解析00秒数。顺便说一句,它接受带秒和不带秒的字符串。

\n\n

使用 Instant 或 OffsetDateTime

\n\n

顺便说一句,由于您的字符串包含偏移量 ( Z) 并且没有时区(如 Africa/Nairobi),因此OffsetDateTime作为表示形式匹配更精确。ZonedDateTime如果您只是搜索/替换整个代码,代码将正常工作,OffsetDateTime因为 API 是相似的。

\n\n

如果偏移量始终为Z(对于 \xe2\x80\x9cZulu 时区\xe2\x80\x9d 或距 UTC 的偏移量 0),请使用Instant

\n\n
    String instantString = "2018-10-11T12:00:00Z";\n    Instant i = Instant.parse(instantString);\n    System.out.println("As Instant: " + i);\n
Run Code Online (Sandbox Code Playgroud)\n\n

我已经为您的String变量指定了一个更适合此代码片段的名称;it\xe2\x80\x99s 仍然是相同的字符串。输出:

\n\n
\n

即时:2018-10-11T12:00:00Z

\n
\n\n

奇怪的Instant.toString是,即使秒数为 0,也会打印秒数。

\n\n

请在 @Basil Bourque 的答案中详细了解要使用的正确类型。

\n\n

你的代码出了什么问题?用于解析 Z 的模式字母

\n\n
\n
// Exception : Text \'2018-10-11T12:00:00Z\' could not be parsed at index 19\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

这里的问题不在于秒,也不在于ss。索引 19 是Z字符串中的位置。两个参数ZonedDateTime.parse对象,因为模式字母与日期时间字符串中的Za 不匹配。Z如果您确实需要提供用于解析的格式模式字符串Z,请使用大写X(其中一个或多个,具体取决于非零偏移量的外观)。来自模式字母的文档:

\n\n
  Symbol  Meaning                     Presentation      Examples\n  ------  -------                     ------------      -------\n   X       zone-offset \'Z\' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15\n   Z       zone-offset                 offset-Z          +0000; -0800; -08:00\n
Run Code Online (Sandbox Code Playgroud)\n\n

链接

\n\n\n