Cómo convertir cualquier timeZone dateTime a fecha UTC en JAVA [duplicado]
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
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);
}
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());
}
}