Cómo convertir cualquier timeZone dateTime a fecha UTC en JAVA [duplicado]

Sep 14 2020

Tengo que usar la fecha y hora que recibo por usuario y convertir esa hora a UTC a partir de la hora dada. En este momento, todas las soluciones están funcionando, pero no como necesitaba. Primero, se convierte a la zona horaria, pero no quiero convertir inicialmente. Tengo que establecer esa zona horaria en mi fecha y luego convertir esa hora a UTC. En este momento, todas y cada una de las soluciones muestran que tengo que pasar la fecha y la hora, y luego obtengo la fecha y la hora actualizadas con la zona horaria que proporciono, y luego se convierte a UTC. Ésta no era mi pregunta.

Mi usuario me enviará la fecha y hora de cualquier zona horaria y mi servidor se ejecutará en la zona horaria UTC. Obtendré la identificación de zona desde el front-end. Quiero convertir esa fecha y hora a UTC y verificar con mis otras condiciones. Es posible que obtenga la hora UTC-7 en una solicitud, y luego, en la siguiente solicitud, obtenga UTC + 5: 30. Por lo tanto, todo el tiempo debe convertirse a UTC y no puedo establecer la zona horaria en la fecha.

Quería establecer la zona horaria específica hasta la fecha, y obtengo la fecha y la hora de esa zona horaria, pero no puedo establecer la zona horaria exacta. Aquí, estoy agregando mi código, por favor dígame dónde estoy equivocado:

Calendar laCalendar = Calendar.getInstance();
laCalendar.set(2020, 8, 14, 00, 00);
Date losAngelesDate = laCalendar.getTime();
System.out.println("LA Date1===>" + losAngelesDate);

SimpleDateFormat simpleTimeFormatForUSA = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
simpleTimeFormatForUSA.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
String americaDateString = simpleTimeFormatForUSA.format(laCalendar.getTime());
SimpleDateFormat dateFormatUSA = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
losAngelesDate = dateFormatUSA.parse(americaDateString);

System.out.println("LA Date2===>" + losAngelesDate);
Date utcDate = losAngelesDate;
Calendar calendar = Calendar.getInstance();
calendar.setTime(utcDate);
TimeZone timeZone = TimeZone.getTimeZone("UTC");
SimpleDateFormat simpleTimeFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
simpleTimeFormat.setTimeZone(timeZone);
String utcTime = simpleTimeFormat.format(calendar.getTime());
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
utcDate = dateFormat.parse(utcTime);
System.out.println("UTC date====>" + utcDate);

Y mi salida es

LA Date1===>Mon Sep 14 00:00:56 UTC 2020
LA Date2===>Sun Sep 13 17:00:00 UTC 2020
UTC date====>Sun Sep 13 17:00:00 UTC 2020

Aquí puede ver que mi DateTime se convierte, pero la zona horaria sigue siendo UTC y quería actualizar eso.

Respuestas

1 SanketParikh Sep 14 2020 at 17:00

Así es como lo escribiría usando las API de fecha / hora de Java 8.

    public static void main(String[] args)
    {
        System.out.println("UTC");
        toTimeZone(new Date(), TimeZone.getTimeZone(ZoneId.of("UTC")));
        
        System.out.println("America/Los_Angeles");
        toTimeZone(new Date(), TimeZone.getTimeZone(ZoneId.of("America/Los_Angeles")));
    }

    public static void toTimeZone(Date date, TimeZone timeZone)
    {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        Instant epochMillisInstant = Instant.ofEpochMilli(calendar.getTimeInMillis());
        LocalDateTime localDateTime = LocalDateTime.ofInstant(epochMillisInstant, ZoneId.systemDefault());
        ZonedDateTime dateTimeToConvert = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
        ZonedDateTime dateTimeWithTimeZone = dateTimeToConvert.withZoneSameInstant(timeZone.toZoneId());
        String formattedDateForNewTimeZone = dateTimeWithTimeZone.format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a"));
        System.out.println(formattedDateForNewTimeZone);
    }

Usando solo las API de fecha / hora de Java 8 - Versión más corta

public static void main(String[] args) {
        System.out.println("UTC");
        toTimeZone(LocalDateTime.now(),"UTC");
        System.out.println("America/Los_Angeles");
        toTimeZone(LocalDateTime.now(),"America/Los_Angeles");
    }

    private static void toTimeZone(LocalDateTime localDateTime, String timeZone) {
        ZonedDateTime localDateTimeToConvert = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
        ZonedDateTime zonedDateTime = localDateTimeToConvert.withZoneSameInstant(ZoneId.of(timeZone));
        String formattedDateForNewTimeZone = zonedDateTime.format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a"));
        System.out.println(formattedDateForNewTimeZone);
    }
Spectric Sep 14 2020 at 16:55

Antes de convertir el calendario en una fecha, configure la zona horaria según sus preferencias.

Por ejemplo:

import java.util.Calendar;
import java.util.TimeZone;

public class Timezone{

    public static void main(String []args){
       Calendar laCalendar = Calendar.getInstance();
       TimeZone timezone = TimeZone.getTimeZone("UTC");
       laCalendar.set(2020, 8, 14, 00, 00);
       laCalendar.setTimeZone(timezone);
       java.util.Date losAngelesDate = laCalendar.getTime();
       System.out.println(losAngelesDate.toString());
    }
}