Thanks @Tunaki for suggesting alternative syntax. This will help you parse the values you entered. Set accordingly.
OffsetDateTime java8OffsetDateTime = OffsetDateTime.parse(candidate, offsetDateTimeFormatter ); DateTimeFormatter customOffsetDateTimeFormatter = new DateTimeFormatterBuilder().appendPattern("yyyy[-MM][-dd['T'HH[:mm[:ss]]]][.SSSXXX]") .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) .parseDefaulting(ChronoField.OFFSET_SECONDS, ZoneOffset.of("-08:00").getTotalSeconds()) .toFormatter();
Test case: (- 06:00 Offset)
import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.temporal.ChronoField; public class App { public static void main(String[] args) { String[] candidates = {"2016-11-21T15:54:51.841Z", "2016-11-21T09:54:51.841-06: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 customOffsetDateTimeFormatter = new DateTimeFormatterBuilder().appendPattern("yyyy[-MM][-dd['T'HH[:mm[:ss]]]][.SSSXXX]") .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) .parseDefaulting(ChronoField.OFFSET_SECONDS, ZoneOffset.of("-06:00").getTotalSeconds()) .toFormatter(); org.joda.time.format.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,customOffsetDateTimeFormatter); 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(); } } }
Exit: (- 06:00 Offset)
candidate: "2016-11-21T15:54:51.841Z" Joda: 2016-11-21T09:54:51.841-06:00 Java8: 2016-11-21T15:54:51.841Z jodaMillis:1479743691841 == javaMillis:1479743691841 candidate: "2016-11-21T09:54:51.841-06:00" Joda: 2016-11-21T09:54:51.841-06:00 Java8: 2016-11-21T09:54:51.841-06:00 jodaMillis:1479743691841 == javaMillis:1479743691841 candidate: "2016" Joda: 2016-01-01T00:00:00.000-06:00 Java8: 2016-01-01T00:00-06:00 jodaMillis:1451628000000 == javaMillis:1451628000000 candidate: "2016-11" Joda: 2016-11-01T00:00:00.000-05:00 Java8: 2016-11-01T00:00-06:00 jodaMillis:1477976400000 != javaMillis:1477980000000 candidate: "2016-11-21" Joda: 2016-11-21T00:00:00.000-06:00 Java8: 2016-11-21T00:00-06:00 jodaMillis:1479708000000 == javaMillis:1479708000000 candidate: "2016-11-21T01" Joda: 2016-11-21T01:00:00.000-06:00 Java8: 2016-11-21T01:00-06:00 jodaMillis:1479711600000 == javaMillis:1479711600000 candidate: "2016-11-21T01:02" Joda: 2016-11-21T01:02:00.000-06:00 Java8: 2016-11-21T01:02-06:00 jodaMillis:1479711720000 == javaMillis:1479711720000 candidate: "2016-11-21T01:02:03" Joda: 2016-11-21T01:02:03.000-06:00 Java8: 2016-11-21T01:02:03-06:00 jodaMillis:1479711723000 == javaMillis:1479711723000
Veeeram
source share