Java – Converts a datetime with a given offset to UTC Java

Converts a datetime with a given offset to UTC Java… here is a solution to the problem.

Converts a datetime with a given offset to UTC Java

Given that I have the string “2019-11-05/23:00” and offset “+07:00”

How will I convert this to LocalDateTime UTC in Java(8).

My current code

@GetMapping("postDate/{date}")
public void testPost(@RequestParam("timezone") String timeZone, @PathVariable String date) {
    String format = "yyyy-MM-dd-HH:mm";
    String offset = timeZone;
    System.out.println(date);
    LocalDateTime timeWithOffset = LocalDateTime.parse(date,
                                                       DateTimeFormatter.ofPattern(format));

System.out.println("\n\n\n" + timeWithOffset + "\n\n\n");

 Cant Figure Out to get LocalDateTime timeInUTC
}

Postman’s request

http://localhost:8080/postDate/2019-11-05-23:00?timezone=+07:00

Solution

You can use region and offset awareness classes in java.time. You get an offset (I recommend naming the parameters accordingly because the offset is not a time zone) and a datetime, which is enough to convert the same moment to a different time zone or offset.

Take a look at this example and read the review:

public static void main(String[] args) {
     this simulates the parameters passed to your method
    String offset = "+07:00";
    String date = "2019-11-05/23:00";

 create a LocalDateTime using the date time passed as parameter
    LocalDateTime ldt = LocalDateTime.parse(date,
                                            DateTimeFormatter.ofPattern("yyyy-MM-dd/HH:mm"));
     parse the offset
    ZoneOffset zoneOffset = ZoneOffset.of(offset);
     create an OffsetDateTime using the parsed offset
    OffsetDateTime odt = OffsetDateTime.of(ldt, zoneOffset);
     print the date time with the parsed offset
    System.out.println(zoneOffset.toString()
            + ":\t" + odt.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
     create a ZonedDateTime from the OffsetDateTime and use UTC as time zone
    ZonedDateTime utcZdt = odt.atZoneSameInstant(ZoneOffset.UTC);
     print the date time in UTC using the ISO ZONED DATE TIME format
    System.out.println("UTC:\t"
            + utcZdt.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
     and then print it again using your desired format
    System.out.println("UTC:\t"
            + utcZdt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH:mm")));
}

The output of my system is:

+07:00: 2019-11-05T23:00:00+07:00
UTC:    2019-11-05T16:00:00Z
UTC:    2019-11-05-16:00

This might work for the opposite case (you get a UTC time and an offset and want OffsetDateTime:

).

public static void main(String[] args) {
     this simulates the parameters passed to your method
    String offset = "+07:00";
    String date = "2019-11-05/16:00";
     provide a pattern
    String formatPattern = "yyyy-MM-dd/HH:mm";
     and create a formatter with it
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern(formatPattern);
     then parse the time to a local date using the formatter
    LocalDateTime ldt = LocalDateTime.parse(date, dtf);
     create a moment in time at the UTC offset (that is just +00:00)
    Instant instant = Instant.ofEpochSecond(ldt.toEpochSecond(ZoneOffset.of("+00:00")));
     and convert the time to one with the desired offset
    OffsetDateTime zdt = instant.atOffset(ZoneOffset.of(offset));
     finally print it using your formatter
    System.out.println("UTC:\t" + ldt.format(dtf));
    System.out.println(zdt.getOffset().toString()
            + ": " + zdt.format(DateTimeFormatter.ofPattern(formatPattern)));
}

The output is this:

UTC:    2019-11-05/16:00
+07:00: 2019-11-05/23:00

Related Problems and Solutions