java - LocalDateTime.parse() 模式只有数字

标签 java parsing datetime java-8 java-time

<分区>

我想从以下模式解析 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

最佳答案

这看起来像是 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尽管它提到了毫秒而不是模式中的文字字符。

关于java - LocalDateTime.parse() 模式只有数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36085626/

相关文章:

python - 从多个网页收集格式化内容

javascript - HighCharts 是否可以选择通过日期时间将 plotLines 动态添加到 xAxis?

java - org.hibernate.hql.internal.QueryExecutionRequestException : Not supported for DML operations [insert into

java - 找不到符号,如何编写自定义异常类

使用 Matlab 的 html 标签的正则表达式

php - 在&符号后将字符串传递给 twitter 失败

c# - DateTime.Parse 的奇怪行为

php - 在 select mysql 上连接数据和文本

java - .pkr 和 .key 文件对于 PGP 有什么区别?

java - 使用 RegEx 匹配大输入时出现 StackOverflowError