【发布时间】:2016-11-23 04:38:05
【问题描述】:
我不知道如何让 Java8 的 DateTime 解析表现得像我试图替换的 Joda 等价物。问题是 Joda 的 ISODateTimeFormat.dateTimeParser(); 允许我输入 YYYY 并且它仍然可以工作(例如,2016 年将变为 2016-01-01T00:00:00.000Z")。我怎样才能从 Java8 获得同样的行为?
代码很简单……
import java.time.OffsetDateTime;
import java.time.temporal.ChronoField;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;
public class Java8OffsetDateTime {
public static void main(String[] args) {
String[] candidates =
{ "2016-11-21T17:54:51.841Z",
"2016-11-21T09:54:51.841-08:00",
"2016", // Java8 no can do?
"2016-11", // Java8 no can do?
"2016-11-21", // Java8 no can do?
"2016-11-21T01", // Java8 no can do?
"2016-11-21T01:02", // Java8 no can do?
"2016-11-21T01:02:03" // Java8 no can do?
};
DateTimeFormatter JodaDateTimeFormatter = ISODateTimeFormat.dateTimeParser();
for (String candidate : candidates) {
System.out.println("\ncandidate:\t\"" + candidate + "\"");
DateTime jodaDateTime = JodaDateTimeFormatter.parseDateTime(candidate);
System.out.println("Joda:\t" + jodaDateTime);
try {
OffsetDateTime java8OffsetDateTime = OffsetDateTime.parse(candidate);
System.out.println("Java8:\t" + java8OffsetDateTime);
long jodaMillis = jodaDateTime.getMillis();
long javaMillis = java8OffsetDateTime.toInstant().toEpochMilli();
System.out.printf("jodaMillis:%d %s javaMillis:%d\n",
jodaMillis,
(jodaMillis==javaMillis) ? "==" : "!=",
javaMillis);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
结果就是挑战……
$ java -cp ~/work/joda-time-2.9.6/joda-time-2.9.6.jar:. Java8OffsetDateTime
candidate: "2016-11-21T17:54:51.841Z"
Joda: 2016-11-21T09:54:51.841-08:00
Java8: 2016-11-21T17:54:51.841Z
jodaMillis:1479750891841 == javaMillis:1479750891841
candidate: "2016-11-21T09:54:51.841-08:00"
Joda: 2016-11-21T09:54:51.841-08:00
Java8: 2016-11-21T09:54:51.841-08:00
jodaMillis:1479750891841 == javaMillis:1479750891841
candidate: "2016"
Joda: 2016-01-01T00:00:00.000-08:00
java.time.format.DateTimeParseException: Text '2016' could not be parsed at index 4
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849)
at java.time.OffsetDateTime.parse(OffsetDateTime.java:402)
at java.time.OffsetDateTime.parse(OffsetDateTime.java:387)
at Java8OffsetDateTime.main(Java8OffsetDateTime.java:26)
candidate: "2016-11"
Joda: 2016-11-01T00:00:00.000-07:00
java.time.format.DateTimeParseException: Text '2016-11' could not be parsed at index 7
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849)
at java.time.OffsetDateTime.parse(OffsetDateTime.java:402)
at java.time.OffsetDateTime.parse(OffsetDateTime.java:387)
at Java8OffsetDateTime.main(Java8OffsetDateTime.java:26)
candidate: "2016-11-21"
Joda: 2016-11-21T00:00:00.000-08:00
java.time.format.DateTimeParseException: Text '2016-11-21' could not be parsed at index 10
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849)
at java.time.OffsetDateTime.parse(OffsetDateTime.java:402)
at java.time.OffsetDateTime.parse(OffsetDateTime.java:387)
at Java8OffsetDateTime.main(Java8OffsetDateTime.java:26)
candidate: "2016-11-21T01"
Joda: 2016-11-21T01:00:00.000-08:00
java.time.format.DateTimeParseException: Text '2016-11-21T01' could not be parsed at index 13
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849)
at java.time.OffsetDateTime.parse(OffsetDateTime.java:402)
at java.time.OffsetDateTime.parse(OffsetDateTime.java:387)
at Java8OffsetDateTime.main(Java8OffsetDateTime.java:26)
candidate: "2016-11-21T01:02"
Joda: 2016-11-21T01:02:00.000-08:00
java.time.format.DateTimeParseException: Text '2016-11-21T01:02' could not be parsed at index 16
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849)
at java.time.OffsetDateTime.parse(OffsetDateTime.java:402)
at java.time.OffsetDateTime.parse(OffsetDateTime.java:387)
at Java8OffsetDateTime.main(Java8OffsetDateTime.java:26)
candidate: "2016-11-21T01:02:03"
Joda: 2016-11-21T01:02:03.000-08:00
java.time.format.DateTimeParseException: Text '2016-11-21T01:02:03' could not be parsed at index 19
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849)
at java.time.OffsetDateTime.parse(OffsetDateTime.java:402)
at java.time.OffsetDateTime.parse(OffsetDateTime.java:387)
at Java8OffsetDateTime.main(Java8OffsetDateTime.java:26)
如何从“Java8 不能做”中摆脱那些java.time.format.DateTimeParseExceptions?案例?
【问题讨论】: