What is the equivalent format string of DateTimeFormatter.ISO_OFFSET_DATE_TIME?
This worked for me:
ZonedDateTime dateTime = ZonedDateTime.now();
System.out.println(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")));
System.out.println(dateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
2018-10-03T07:24:14.772+03:00
2018-10-03T07:24:14.772+03:00
Though it will not always produce the same result because ISO_OFFSET_DATE_TIME prints fraction of second with different length depending on nanos value, while .SSS has fixed lengh = 3
ZonedDateTime dateTime = ZonedDateTime.of(2001, 1, 1, 0, 0, 0, 1, ZoneId.systemDefault());
System.out.println(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")));
System.out.println(dateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
2001-01-01T00:00:00.000+02:00
2001-01-01T00:00:00.000000001+02:00
No, this is not possible
On request: Yes, we know that there is no equivalent format pattern string of DateTimeFormatter.ISO_OFFSET_DATE_TIME
.
DateTimeFormatter.ISO_OFFSET_DATE_TIME
omits the seconds and/or nano of second if they are zero. If the nanos are non-zero “As many digits will be output as required.” There is no pattern letter or combination of pattern letters that will give you the same behaviour.
Deep inside DateTimeFormatter
, ISO_OFFSET_DATE_TIME
uses an ISO_LOCAL_TIME
, which in turn is defined in this way:
ISO_LOCAL_TIME = new DateTimeFormatterBuilder()
.appendValue(HOUR_OF_DAY, 2)
.appendLiteral(':')
.appendValue(MINUTE_OF_HOUR, 2)
.optionalStart()
.appendLiteral(':')
.appendValue(SECOND_OF_MINUTE, 2)
.optionalStart()
.appendFraction(NANO_OF_SECOND, 0, 9, true)
.toFormatter(ResolverStyle.STRICT, null);
Which is the way to obtain the dynamic behaviour: using a DateTimeFormatterBuilder
and its optionalStart
and appendFraction
methods.
As an aside, you don’t want to copy the behaviour of ISO_OFFSET_DATE_TIME
exactly. You will want to use the built-in formatter.