Java 8 Convert given time and time zone to UTC time

JavaJava 8UtcJava Time

Java Problem Overview


I have a time with string type like: "2015-01-05 17:00" and ZoneId is "Australia/Sydney".

How can I convert this time information to the corresponding to UTC time using Java 8 datetime API?

Also need to considering DST stuff.

Java Solutions


Solution 1 - Java

You are looking for ZonedDateTime class in Java8 - a complete date-time with time-zone and resolved offset from UTC/Greenwich. In terms of design, this class should be viewed primarily as the combination of a LocalDateTime and a ZoneId. The ZoneOffset is a vital, but secondary, piece of information, used to ensure that the class represents an instant, especially during a daylight savings overlap.

For example:

ZoneId australia = ZoneId.of("Australia/Sydney");
String str = "2015-01-05 17:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime localtDateAndTime = LocalDateTime.parse(str, formatter);
ZonedDateTime dateAndTimeInSydney = ZonedDateTime.of(localtDateAndTime, australia );

System.out.println("Current date and time in a particular timezone : " + dateAndTimeInSydney);

ZonedDateTime utcDate = dateAndTimeInSydney.withZoneSameInstant(ZoneOffset.UTC);

System.out.println("Current date and time in UTC : " + utcDate);

Solution 2 - Java

An alternative to the existing answer is to setup the formatter with the appropriate time zone:

String input = "2015-01-05 17:00";
ZoneId zone = ZoneId.of("Australia/Sydney");

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(zone);
ZonedDateTime utc = ZonedDateTime.parse(input, fmt).withZoneSameInstant(UTC);

Since you want to interact with a database, you may need a java.sql.Timestamp, in which case you don't need to explicitly convert to a UTC time but can use an Instant instead:

ZonedDateTime zdt = ZonedDateTime.parse(input, fmt);
Timestamp sqlTs = Timestamp.from(zdt.toInstant());

Solution 3 - Java

   **// Refactored Logic**     

        ZoneId australia = ZoneId.of("Australia/Sydney");
		ZoneId utcZoneID= ZoneId.of("Etc/UTC");
		String ausTime = "2015-01-05 17:00";
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
		
		//converting in datetime of java8
	    LocalDateTime ausDateAndTime = LocalDateTime.parse(ausTime, formatter);
	    
	    // DateTime With Zone
	    ZonedDateTime utcDateAndTime = ausDateAndTime.atZone(utcZoneID);
	    // output - 2015-01-05T17:00Z[Etc/UTC]
	    
	    // With Formating DateTime
	    String utcDateTime = utcDateAndTime.format(formatter);
	    // output - 2015-01-05 17:00

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiontttView Question on Stackoverflow
Solution 1 - JavaMateusz SrokaView Answer on Stackoverflow
Solution 2 - JavaassyliasView Answer on Stackoverflow
Solution 3 - JavaMukeshView Answer on Stackoverflow