【发布时间】:2016-08-11 01:39:13
【问题描述】:
在java.time 类中,我们如何为DateTimeFormatter 指定格式模式,允许使用句号(.)(句点或点)或逗号(,)作为分隔符几分之一秒?
例如,以下方法适用于在20090813145607.0Z 和20090813145607,0Z 中解析以.0Z 或,0Z 结尾的输入日期值。
String input = "20090813145607.0Z";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "uuuuMMddHHmmss[,S][.S]X" );
但是对于打印,输出包含 both,生成一对重复的小数秒。
20090813145607,0.0Z
所以我推断我在格式化模式中使用[,S][.S] 不是获得此功能的正确方法。
DecimalStyle
我尝试使用传递DecimalStyle 的DateTimeFormatter::withDecimalStyle 方法,但在我的实验中未能达到我的预期。该文档并未真正解释其预期行为。
这个问题很重要,因为ISO 8601 标准建议使用 COMMA,但允许使用 FULL STOP。实践中常用的。
Instant 不能容忍逗号
也许这种逗号和/或点的容忍度为decimal mark 在java.time 中是不可能的。
我在 Java 8 Update 102 中尝试了以下代码。带有 FULL STOP(点)的第一个输入成功,而带有 COMMA 的第二个输入失败。
String inputDot = "2016-01-02T12:34:56.7Z"; // Succeeds.
Instant instantDot = Instant.parse ( inputDot );
String inputComma = "2016-01-02T12:34:56,7Z"; // Fails. Throws a DateTimeParseException.
Instant instantComma = Instant.parse ( inputComma );
【问题讨论】:
-
澄清一下,你想要一个
DateTimeFormatter可以处理两种格式的解析,但只有一个格式的格式? -
我想知道“DateTimeFormatter”是否允许这种“或”模式。我能想到的两种解决方法是 1. 制作 2 格式化程序,一种用于
,,一种用于.,如果第一个无法解析,请使用第二个。或者 2,通过将倒数第三个字符替换为.(如果它是,)来“规范化”输入,并且您可以使用单个格式化程序 -
@SotiriosDelimanolis 是的,我想要一个既适用于输入又适用于输出的格式化程序。我假设 java.time 类对命令和点都有这样的双向支持,但假设错误。请参阅我的编辑,显示
Instant.parse可以处理点但不能处理逗号。 -
在 Java 时代对有缺陷的 ISO8601 支持的有趣发现。如果它可以作为一个问题提出,那就太好了:)
-
我已经在 bugs.java.com 上提交了“Review ID: JI-9042753”。在审核之前可能不会出现在此处。
标签: java parsing datetime-format java-time date-parsing