Home > Back-end >  Convert UTC datetime to local datetime using java.time
Convert UTC datetime to local datetime using java.time

Time:11-14

I have a UTC date-time like this (a String): 2022-11-22T17:15:00

And a ZoneID like this: "America/Tijuana"

Using java.time API, I want to get the actual datetime for that zone, which is: 2022-11-22T09:15:00 (the time is 09:15 instead of 17:15)

  • ZonedDateTime.toLocalDateTime() returns: 2022-11-22T17:15
  • ZonedDateTime.toString() returns: 2022-11-22T17:15-08:00[America/Tijuana]

None of the above gives me what I'm looking for.

This is my code:

    ZoneId zonaID = ZoneId.of('America/Tijuana');
    CharSequence dateUTC = "2022-11-22T17:15:00";
    LocalDateTime dateTimeL = LocalDateTime.parse(dateUTC);
    ZonedDateTime myZDT = ZonedDateTime.now();
    ZonedDateTime myZDTFinal = myZDT.of(dateTimeL, zonaID);
    System.out.println("using toLocalDateTime: "   myZDTFinal.toLocalDateTime());
    System.out.println("using toString: "   myZDTFinal.toString());

I know that this might be a duplicated question but there's so many questions about date-times and I just haven't been able to figure out this.

Any help will be really appreciated.

CodePudding user response:

You have to convert your date to UTC, then convert the convert this zone to your expected zone using withZoneSameInstant like this:

ZonedDateTime toUTCZone  = ZonedDateTime.of(dateTimeL, ZoneOffset.UTC);
ZonedDateTime myZDTFinal = toUTCZone.withZoneSameInstant(zonaID);

Output

2022-11-22T09:15-08:00[America/Tijuana]

CodePudding user response:

ZonedDateTime#withZoneSameInstant

Use it to convert a ZonedDateTime into another ZonedDateTime of the corresponding ZoneId.

Finally, get the LocalDateTime out of the ZonedDateTime by using ZonedDateTime#toLocalDateTime.

LocalDateTime
    .parse("2022-11-22T17:15:00") // Parse the given date-time string into LocalDateTime
    .atZone(ZoneOffset.UTC) // Convert it into a ZonedDateTime 
    .withZoneSameInstant(ZoneId.of("America/Tijuana")) // Convert the result into a ZonedDateTime at another time-zome
    .toLocalDateTime() // Convert the result into LocalDateTime

Demo:

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        LocalDateTime ldtInTijuana = LocalDateTime.parse("2022-11-22T17:15:00")
                .atZone(ZoneOffset.UTC)
                .withZoneSameInstant(ZoneId.of("America/Tijuana"))
                .toLocalDateTime();
        System.out.println(ldtInTijuana);

        // Custom format
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss", Locale.ENGLISH);
        String formatted = ldtInTijuana.format(formatter);
        System.out.println(formatted);
    }
}

Output:

2022-11-22T09:15
2022-11-22T09:15:00

Note that LocalDateTime#toString removes second and fraction-of-second values if they are zero. If you want to keep them (as you have posted in your question), you can do so by using a DateTimeFormatter as shown above.

Learn more about the modern Date-Time API from Trail: Date Time.

  • Related