我需要将表示DateTime的字符串解析为要操作的Java 8 DateTime
对象.例如,有效字符串为(ALL datetime components (except year) are optional):
2015
2015-01
2015-01-01
2015-02-03T00
2015-02-03T00:30
2015-02-03T00:30:50
2015-02-03T00:30:50Z
2015-02-03T00:30:50.333Z
2015-02-03T00:30:50.333+03:00
2015-02-03T00:30:50.333+0300
2015-02-03T00:30:50.333-08
2015-02-03T00:30:50.333GMT+8
2015-02-03GMT+8
2015-02UTC-3
2015-02PST
...
我从https://stackoverflow.com/a/52823661/2028440找到的最好的代码(包括我从https://stackoverflow.com/a/65985789/2028440开始的调整),
DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.appendValue(ChronoField.YEAR, 4)
.appendPattern("[['-']MM[['-']dd[['T']HH[[':']mm[[':']ss['.'SSS]]]]]][Z][O][VV]")
.parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
.parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.parseDefaulting(ChronoField.NANO_OF_SECOND, 0)
.toFormatter();
String[] s = {
"2018",
"2018-10",
"2018-10-15",
"2018-10-15T12:00",
"2018-10-15T12:00:30",
"2018-10-15T12:00:30.123Z",
"2018-10-15T12:00:30.123-0800",
"2018-10-15T12:00:30.123UTC-08:00",
"2018-10-15T12:00:30.123GMT+9"
};
for (String line : s) {
System.out.println(LocalDateTime.parse(line, dtf));
}
控制台输出为:
2018-01-01T00:00
2018-10-01T00:00
2018-10-15T00:00
2018-10-15T12:00
2018-10-15T12:00:30
2018-10-15T12:00:30.123
2018-10-15T12:00:30.123
2018-10-15T12:00:30.123
2018-10-15T12:00:30.123
但是它不能正确地将时间偏移量解析为它打印的最后三个值2018-10-15T12:00:30.123
.
他们每个人也应该得到print the correct time offset英镑. 以下是最后3个测试字符串的正确输出:
"2018-10-15T12:00:30.123-08:00"
"2018-10-15T12:00:30.123-08:00"
"2018-10-15T12:00:30.123+09:00"
它类似于以下命令的输出:
System.out.println(ZonedDateTime.parse("2018-10-15T12:00:30.123-08:00").toString());
prints
2018-10-15T12:00:30.123-08:00
当我试图改变的时候:
System.out.println(LocalDateTime.parse(line, dtf));
致:
System.out.println(ZonedDateTime.parse(line, dtf));
我收到了这样的错误:
Exception in thread "main" java.time.format.DateTimeParseException: Text '2018' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO resolved to 2018-01-01T00:00 of type java.time.format.Parsed
at java.base/java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:2017)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1952)
at java.base/java.time.ZonedDateTime.parse(ZonedDateTime.java:598)