Search code examples
androidkotlindatejava-timetimezone-offset

How do I format this date


I am trying to parse the date which is in the format 2021-01-15T19:00:00+0000. I am not sure which format it is but based on my research I tried with methods below

1. val odt = OffsetDateTime.parse("2021-01-15T19:00:00+0000")
2. val zdt = ZonedDateTime.parse("2021-01-15T19:00:00+0000")

It is logging the exception:

java.time.format.DateTimeParseException: Text '2021-01-15T19:00:00+0000' could not be parsed at index 19
        at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
        at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
        at java.time.ZonedDateTime.parse(ZonedDateTime.java:591)
        at java.time.ZonedDateTime.parse(ZonedDateTime.java:576)

Solution

  • tl;dr

    OffsetDateTime
    .parse( 
        "2021-01-15T19:00:00+0000" , 
        DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ssxxxx" ) 
    )
    .toString()
    

    2021-01-15T19:00Z

    OffsetDateTime

    Your input has an offset of zero hours-minutes-seconds from UTC, the +0000 portion.

    So you should be parsing with OffsetDateTime rather than ZonedDateTime.

    ZonedDateTime

    The ZonedDateTime class is for a time zone rather than an offset. A time zone is the named history of the past, present, and future changes to the offset used by the people of a particular region, as decided by their politicians. Time zones have a name in format of Continent/Region such as Europe/Paris or America/Edmonton.

    Optional COLON in offset

    Unfortunately, your input omitted the COLON character from between the hours and minutes of the offset. While optional in the ISO 8601 standard, the parse method expects to find that character.

    If you know all the inputs have the same +0000 I would simply perform a string manipulation.

    OffsetDateTime odt = OffsetDateTime.parse( "2021-01-15T19:00:00+0000".replace( "+0000" , "+00:00" ) ) ;
    

    If some other offsets might appear, you must specify a formatting pattern.

    DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ssxxxx" ) ;
    OffsetDateTime odt = OffsetDateTime.parse( input , f ) ;
    

    See this code run live at Ideone.com.

    2021-01-15T19:00Z