LocalDateTime.parse() 仅具有模式数字
LocalDateTime.parse() with a pattern only numbers
我想从以下模式解析 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 版本:1.8.0_60 OSX
这看起来像是 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 相似,尽管它在模式中提到的是毫秒而不是文字字符。
我想从以下模式解析 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 版本:1.8.0_60 OSX
这看起来像是 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 相似,尽管它在模式中提到的是毫秒而不是文字字符。