1. Overview

In this quick tutorial, we’ll see how to convert a ZonedDateTime to a String.

We’ll also look at how to parse a ZonedDateTime from a String.

2. Creating a ZonedDateTime

First, we’ll start with a ZonedDateTime with a time zone of UTC. There are several ways we can accomplish this.

We can specify the year, month, day, etc:

ZonedDateTime zonedDateTimeOf = ZonedDateTime.of(2018, 01, 01, 0, 0, 0, 0, ZoneId.of("UTC"));

We can also create a ZonedDateTime from the current date and time:

ZonedDateTime zonedDateTimeNow = ZonedDateTime.now(ZoneId.of("UTC"));

Or, we can create a ZonedDateTime from an existing LocalDateTime:

LocalDateTime localDateTime = LocalDateTime.now();
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.of("UTC"));

3. ZonedDateTime to String

Now, let’s convert our ZonedDateTime to a String. For this, we’ll use the DateTimeFormatter class.

There are a few special formatters that we can use to display time zone data. The full list of formatters can be found here, but we’ll look at a few of the more common ones.

If we want to display the time zone offset, we can use the formatter “Z” or “X”:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy - HH:mm:ss Z");
String formattedString = zonedDateTime.format(formatter);

This would give us a result like this:

02/01/2018 - 13:45:30 +0000

To include the time zone name, we can use a lowercase “z”:

DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("MM/dd/yyyy - HH:mm:ss z");
String formattedString2 = zonedDateTime.format(formatter2);

The output of this would be:

02/01/2018 - 13:45:30 UTC

4. String to ZonedDateTime

This process can also work in reverse. We can take a string and convert it back into a ZonedDateTime.

One option to do this is by using the static parse() method of the ZonedDateTime class:

ZonedDateTime zonedDateTime = ZonedDateTime.parse("2011-12-03T10:15:30+01:00");

This method uses the ISO_ZONED_DATE_TIME formatter. There’s also an overloaded version of the method that takes a DateTimeFormatter parameter. However, the String has to contain a zone identifier or we’ll get an exception:

assertThrows(DateTimeParseException.class, () -> 
  ZonedDateTime.parse("2011-12-03T10:15:30", DateTimeFormatter.ISO_DATE_TIME));

A second option to obtain a ZonedDateTime from a String involves 2 steps: converting the String to a LocalDateTime, then this object to a ZonedDateTime:

ZoneId timeZone = ZoneId.systemDefault();
ZonedDateTime zonedDateTime = LocalDateTime.parse("2011-12-03T10:15:30", 
  DateTimeFormatter.ISO_DATE_TIME).atZone(timeZone);

log.info(zonedDateTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));

This indirect method simply combines the date-time with a zone id:

INFO: 2011-12-03T10:15:30+02:00[Europe/Athens]

To learn more about parsing String to dates, check out our more in-depth date parsing article.

5. Conclusion

In this article, we’ve seen how to create a ZonedDateTime, and how to format it as a String.

We’ve also taken a quick look at how to parse a date time string and convert into a ZonedDateTime.

The source code for this tutorial is available over on Github.