【问题标题】:LocalDateTime.parse() with a pattern only numbers [duplicate]LocalDateTime.parse() 模式只有数字[重复]
【发布时间】:2016-07-05 06:45:00
【问题描述】:

我想从以下模式解析 LocalDateTime:

yyyyMMddHHmmss000000

这意味着通常的“yyyy...ss”,然后是六个尾随零。

所以,格式化工作正常:

String p = "yyyyMMddHHmmss'000000'";
LocalDateTime.now().format(DateTimeFormatter.ofPattern(p));

但解析:

String p, v;
p = "yyyyMMddHHmmss";                                    // without '000000'
v = "20160131235930";
LocalDateTime.parse(v, DateTimeFormatter.ofPattern(p));  // it works


p = "yyyy-MMddHHmmss'000000'";                           // with '-' in between
v = "2016-0131235930000000";
LocalDateTime.parse(v, DateTimeFormatter.ofPattern(p));  // it works


p = "yyyyMMddHHmmss'000000'";                            // with '000000' but without '-'
v = "20160131235930000000";
LocalDateTime.parse(v, DateTimeFormatter.ofPattern(p));  // it throws Exception

例外:

java.time.format.DateTimeParseException: Text '20160131235930000000' could not be parsed at index 0
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849)
at java.time.LocalDateTime.parse(LocalDateTime.java:492)
...

我无法更改输入值的格式。我怎样才能正确解析它?我的模式错了吗?

Java 版本:OSX 上的 1.8.0_60

【问题讨论】:

标签: java parsing datetime java-8 java-time


【解决方案1】:

这看起来像是 DateTimeFormatter 及其对可变宽度输入的处理的错误。

DateTimeFormatterBuilder构造下面的格式化程序解决了这个问题

DateTimeFormatter formatter = 
        new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4)
                                      .appendValue(ChronoField.MONTH_OF_YEAR, 2)
                                      .appendValue(ChronoField.DAY_OF_MONTH, 2)
                                      .appendValue(ChronoField.HOUR_OF_DAY, 2)
                                      .appendValue(ChronoField.MINUTE_OF_HOUR, 2)
                                      .appendValue(ChronoField.SECOND_OF_MINUTE, 2)
                                      .appendLiteral("000000")
                                      .toFormatter();

不同之处在于它强制使用appendValue(field, width)解析字段的宽度。

这个错误听起来与提到的in another answer of mine 相似,尽管它在模式中提到毫秒而不是文字字符。

【讨论】:

  • 唯一的缺点是你引入了 Y10K 问题:)
  • @bowmore 正确 :D 让我们希望到那时该错误将得到解决 :)。
猜你喜欢
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多