Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to obtain OffsetDateTime from TemporalAccessor

Tags:

When I do this

String datum = "20130419233512"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.of("Europe/Berlin")); OffsetDateTime datetime = OffsetDateTime.parse(datum, formatter); 

I get the following exception:

    java.time.format.DateTimeParseException: Text '20130419233512' could not be parsed:  Unable to obtain OffsetDateTime from TemporalAccessor: {InstantSeconds=1366407312},ISO,Europe/Berlin resolved  to 2013-04-19T23:35:12 of type java.time.format.Parsed 

How can I parse my datetime string so that it is interpreted as always being from the timezone "Europe/Berlin" ?

like image 748
asmaier Avatar asked Feb 09 '16 17:02

asmaier


1 Answers

The problem is that there is a difference between what a ZoneId is and a ZoneOffset is. To create a OffsetDateTime, you need an zone offset. But there is no one-to-one mapping between a ZoneId and a ZoneOffset because it actually depends on the current daylight saving time. For the same ZoneId like "Europe/Berlin", there is one offset for summer and a different offset for winter.

For this case, it would be easier to use a ZonedDateTime instead of an OffsetDateTime. During parsing, the ZonedDateTime will correctly be set to the "Europe/Berlin" zone id and the offset will also be set according to the daylight saving time in effect for the date to parse:

public static void main(String[] args) {     String datum = "20130419233512";     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.of("Europe/Berlin"));     ZonedDateTime datetime = ZonedDateTime.parse(datum, formatter);      System.out.println(datetime.getZone()); // prints "Europe/Berlin"     System.out.println(datetime.getOffset()); // prints "+02:00" (for this time of year) } 

Note that if you really want an OffsetDateTime, you can use ZonedDateTime.toOffsetDateTime() to convert a ZonedDateTime into an OffsetDateTime.

like image 70
Tunaki Avatar answered Sep 25 '22 14:09

Tunaki