【发布时间】:2017-09-20 12:01:31
【问题描述】:
我正在尝试为当前我实现的可选时间部分创建日期时间格式
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.text.ParseException;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
System.out.println(Ideone.getDate("2017-07-01T00:00:00.0Z"));
System.out.println(Ideone.getDate("2017-07-01T00:00:00.00Z"));
System.out.println(Ideone.getDate("2017-07-01T00:00:00.000Z"));
}
public static LocalDateTime getDate(String date) {
try {
DateTimeFormatter formatter2 =
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[.SSS]'Z'");
LocalDateTime ldt = LocalDateTime.parse(date, formatter2);
return ldt;
} catch (DateTimeParseException ex) {
return null;
}
}
}
还有输出
空
2017-07-01T00:00
2017-07-01T00:00
现在我的问题是,为什么带有 1 个时间分数的日期不起作用,而它正在使用 2 个和 3 个分数?它应该接受 1,2 和 3 分数吗?还是只有 3 个分数?
提前致谢
【问题讨论】:
-
我认为它在documentation 中指定得不好。这就是为什么我评论了一些可能对你有用的东西,但我无法真正回答你的问题。
-
好的。不直接相关,但最好使用
yyyy-MM-dd'T'HH:mm:ss[.SSS][.SS][.S]X-X将解析偏移量(Z是 UTC designator 并且虽然LocalDateTime丢弃它,但最好不要将其视为文字) -
我担心你发现了一个微妙的错误。为了比较:使用我的 lib Time4J 按您的模式工作:
LocalDateTime ldt = ChronoFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[.SSS]'Z'", PatternType.CLDR, Locale.ROOT, PlainTimestamp.axis(TemporalType.LOCAL_DATE_TIME)).parse(input); -
根据DateTimeFormatterBuilder javadoc,
SSS等价于appendFraction(ChronoField.NANO_OF_SECOND, 3, 3, false),所以它应该正好接受 3 位数字。这看起来真的像一个错误。 -
@Hugo 我也尝试过调试。 3 的最小宽度仅在严格解析期间很重要。但是解析器并不严格(经过测试)。无论如何,即使在严格模式下,解析器也会在可选部分内失败,然后按照规范不会中止而是保持旧位置(在点处)并尝试跳转到下一个模式指令(这里的“Z”为文字,然后会失败,因为输入有点而不是“Z在那个位置=>不同的原因)。没有那样的东西,所以它显然是一个错误。
标签: java java-8 datetime-format java-time