Convierte UTC a hora local en Android

En mi proyecto, obtuve 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 a la hora local. Aquí es donde siempre usamos esto, la aplicación necesita mostrar la hora local. ¿Cómo hago esto?

Aquí hay un código que he intentado:

 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); 

Suponer que una fecha contiene el Jul 16, 2013 12:08:59 AM

    Aquí está mi bash:

     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 contribuir con la respuesta moderna. Si bien SimpleDateFormat era la clase que teníamos para analizar y formatear fechas en 2013 (aparte de Joda-Time), ahora está desactualizada, y tenemos mucho mejor en java.time o JSR-310, la fecha Java moderna y tiempo API 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, todavía puede utilizar la moderna API de fecha y hora de Java en ellos a través de ThreeTenABP, el backport de JSR-310 a Android Java 7. Los detalles están en esta pregunta: Cómo utilizar ThreeTenABP en el Proyecto 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 2 horas antes que UTC, esta impresión

     Jul 16, 2013 02:08:59 AM 

    Puntos adicionales:

    • Como tiene AM en la cadena, asumí que sus horas están dentro de AM, del 1 al 12. Para analizarlas y formatearlas correctamente, necesita minúsculas h en la cadena de patrones de formato. La letra H mayúscula es para la hora del día de 0 a 23.
    • Prefiere dar una configuración explícita al formateador (ya sea SimpleDateFormat o DateTimeFormatter ). 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 es posible que su código se ejecute correctamente en muchos dispositivos hasta que un día se ejecute en un dispositivo con configuraciones no inglesas y se cuelgue, y le resulta difícil entender por qué.
    • Si puede, proporcione el huso horario deseado explícitamente, por ejemplo como ZoneId.of("Asia/Kolkata") . La zona horaria predeterminada de la JVM puede ser cambiada por otras partes de su progtwig u otros progtwigs que se ejecutan en la misma JVM, por lo que no es confiable.
     //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); 

    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.Conversor local a 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 a 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; }