问题
I have this code:
String date = "2019-04-22T00:00:00+02:00";
OffsetDateTime odt = OffsetDateTime
.parse(date, DateTimeFormatter.ISO_OFFSET_DATE_TIME)
.withOffsetSameInstant(ZoneOffset.of("+00:00"));
System.out.println(odt);
This print: 2019-04-21T22:00Z
How can I print 2019-04-21T22:00+00:00
? With offset instead of Z
.
回答1:
None of the static DateTimeFormatter
s do this in the standard library.
They either default to Z
or GMT
.
To achieve +00:00
for no offset, you will have to build your own DateTimeFormatter
.
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("UTC"));
DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder()
.append(ISO_LOCAL_DATE_TIME) // use the existing formatter for date time
.appendOffset("+HH:MM", "+00:00") // set 'noOffsetText' to desired '+00:00'
.toFormatter();
System.out.println(now.format(dateTimeFormatter)); // 2019-12-20T17:58:06.847274+00:00
回答2:
My version would be:
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssxxx");
String date = "2019-04-22T00:00:00+02:00";
OffsetDateTime odt = OffsetDateTime
.parse(date)
.withOffsetSameInstant(ZoneOffset.UTC);
System.out.println(odt.format(outputFormatter));
Output is the desired:
2019-04-21T22:00:00+00:00
When toString()
gives output in an unwanted format, the answer is using a DateTimeFormatter
for formatting into the desired format. Lowercase xxx
in the format pattern string produces offset formatted in hours and minutes with a colon as shown, also when the offset is 0.
While OffsetDateTime.toString()
doesn’t produce the format that you wanted, OffsetDateTime
is still able to parse it without any explicit formatter. So in my version of the code I left it out.
There is a constant already declared for ZoneOffset.of("+00:00")
, which I prefer to use: ZoneOffset.UTC
.
来源:https://stackoverflow.com/questions/59429419/offsetdatetime-print-offset-instead-of-z