convert - obtener hora utc java
Convertir UTC en hora local en Android (5)
En mi proyecto, tengo la respuesta de la API en formato json. Obtengo un valor de cadena de tiempo en formato de hora UTC como este Jul 16, 2013 12:08:59 AM
.
Necesito cambiar esto en hora local. Ahí es donde siempre usamos esto, la aplicación necesita mostrar la hora local. ¿Cómo hago esto?
Aquí hay un código que he probado:
String aDate = getValue("dateTime", aEventJson);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss z");
simpleDateFormat.setTimeZone(TimeZone.getDefault());
String formattedDate = simpleDateFormat.format(aDate);
Supongamos que aDate contiene Jul 16, 2013 12:08:59 AM
Aquí está mi intento:
String dateStr = "Jul 16, 2013 12:08:59 AM";
SimpleDateFormat df = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a", Locale.ENGLISH);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = df.parse(dateStr);
df.setTimeZone(TimeZone.getDefault());
String formattedDate = df.format(date);
También note la "a" para el marcador am / pm ...
Me gustaría aportar la respuesta moderna. Si bien SimpleDateFormat
era la clase que teníamos para analizar y dar formato a las fechas en 2013 (aparte de Joda-Time), ahora está obsoleta, y tenemos mucho mejor en java.time
o JSR-310, la fecha moderna de Java y API de tiempo que salió con Java 8 en 2014.
Pero la mayoría de los dispositivos Android todavía no ejecutan Java 8, te oigo decir. Afortunadamente, aún puede usar la API de fecha y hora de Java moderna en ellos a través de ThreeTenABP, el puerto de JSR-310 a Android Java 7. Los detalles están en esta pregunta: Cómo usar ThreeTenABP en el Proyecto de Android .
Ahora el código es:
DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("MMM dd, uuuu hh:mm:ss a", Locale.ENGLISH);
String aDate = "Jul 16, 2013 12:08:59 AM";
String formattedDate = LocalDateTime.parse(aDate, formatter)
.atOffset(ZoneOffset.UTC)
.atZoneSameInstant(ZoneId.systemDefault())
.format(formatter);
System.out.println(formattedDate);
Dado que mi computadora está ejecutando la zona horaria de Europa / Copenhague, que en julio es de 2 horas antes de UTC, esto imprime
Jul 16, 2013 02:08:59 AM
Otros puntos:
- Ya que tienes AM en tu cadena, asumí que tus horas están dentro de la AM, de 1 a 12. Para analizarlas y formatearlas correctamente, necesitas una
h
minúscula en la cadena de patrón de formato. La mayúsculaH
es para la hora del día de 0 a 23. - Prefiero dar una configuración regional explcit al formateador (ya sea
SimpleDateFormat
oDateTimeFormatter
). Si no se proporciona una configuración regional, el formateador utilizará la configuración regional predeterminada del dispositivo. “Jul” y “AM” están en inglés, y su código puede funcionar bien en muchos dispositivos hasta que un día se ejecuta en un dispositivo con una configuración regional que no está en inglés y se bloquea, y le resulta difícil averiguar por qué. - Si puede, indique la zona horaria deseada explícitamente, por ejemplo, como
ZoneId.of("Asia/Kolkata")
. La zona horaria predeterminada de la JVM puede ser modificada por otras partes de su programa u otros programas que se ejecutan en la misma JVM, por lo que no es confiable.
Usuario el siguiente código.
TimeZone defaultTimeZone = TimeZone.getDefault();
String strDefaultTimeZone = defaultTimeZone.getDisplayName(false, TimeZone.SHORT);
//Your Code
String aDate = getValue("dateTime", aEventJson);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss z");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone(strDefaultTimeZone));
String formattedDate = simpleDateFormat.format(aDate);
Esto debería funcionar.
1.Local al convertidor de UTC
public static String localToUTC(String dateFormat, String datesToConvert) {
String dateToReturn = datesToConvert;
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
sdf.setTimeZone(TimeZone.getDefault());
Date gmt = null;
SimpleDateFormat sdfOutPutToSend = new SimpleDateFormat(dateFormat);
sdfOutPutToSend.setTimeZone(TimeZone.getTimeZone("UTC"));
try {
gmt = sdf.parse(datesToConvert);
dateToReturn = sdfOutPutToSend.format(gmt);
} catch (ParseException e) {
e.printStackTrace();
}
return dateToReturn;
}
2. UTC al convertidor local
public static String uTCToLocal(String dateFormatInPut, String dateFomratOutPut, String datesToConvert) {
String dateToReturn = datesToConvert;
SimpleDateFormat sdf = new SimpleDateFormat(dateFormatInPut);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date gmt = null;
SimpleDateFormat sdfOutPutToSend = new SimpleDateFormat(dateFomratOutPut);
sdfOutPutToSend.setTimeZone(TimeZone.getDefault());
try {
gmt = sdf.parse(datesToConvert);
dateToReturn = sdfOutPutToSend.format(gmt);
} catch (ParseException e) {
e.printStackTrace();
}
return dateToReturn; }
//your UTC time var
long time = UTCtime;
//convert it
Time timeFormat = new Time();
timeFormat.set(time+TimeZone.getDefault().getOffset(time));
//use the value
long localTime = timeFormat.toMillis(true);