Problema de zona horaria en Android

Tengo tiempo en milisegundos y estoy mostrando ese tiempo en mi aplicación en formato "MM/dd/yyyy HH:mm:ss" , está funcionando bien.

Problema : si cambio el huso horario en el dispositivo android muestra tiempo diferente en mi aplicación puede ser debido a algún cálculo de zona horaria. Quiero mostrar la misma hora que está en mi base de datos como está en cualquier zona horaria.

Estoy usando código debajo para probar el problema de la zona horaria

 Locale locale = new Locale("en", "IN"); TimeZone tz = TimeZone.getDefault(); System.out.println("Default timezon id :: " + tz.getID()); tz.setID("Asia/Calcutta"); String timezon = tz.getDisplayName(false, TimeZone.SHORT, locale); System.out.println("Timezon id :: " + tz.getID() + " Timezon name :: " + timezon); Calendar cal = Calendar.getInstance(tz, locale); System.out.println("TImezon :: " + tz); // "1319084400775" is the milliseconds of 10/20/2011 05:20:00 in MM/dd/yyyy HH:mm:ss format Date date = new Date(Long.parseLong("1319084400775")); System.out.println("Date :: " + date.toGMTString()); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", locale); System.out.println("Start date :: " + format.format(date)); // "1319084400775" is the milliseconds of 10/20/2011 05:20:00 in MM/dd/yyyy HH:mm:ss format cal.setTimeInMillis(Long.parseLong("1319084400775")); timezon = cal.getTimeZone().getDisplayName(false, TimeZone.SHORT, locale); System.out.println("Calender's timezon :: " + timezon); System.out.println("Start date :: yyyy-mm-dd hh:mm:ss " + cal.get(Calendar.YEAR) + "-" + cal.get(Calendar.MONTH) + "-" + cal.get(Calendar.DAY_OF_MONTH) + " " + cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE)); // "1319084700776" is the milliseconds of 10/20/2011 05:25:00 in MM/dd/yyyy HH:mm:ss format cal.setTimeInMillis(Long.parseLong("1319084700776")); System.out.println("End date :: " + cal.getTime()); 

Salida ::

Si establezco una zona horaria para "Pacific / Fiji";

 10-07 17:03:40.392: INFO/System.out(1193): Default timezon id :: Pacific/Fiji 10-07 17:03:40.392: INFO/System.out(1193): Timezon id :: Asia/Calcutta Timezon name :: GMT+05:30 10-07 17:03:40.406: INFO/System.out(1193): TImezon :: org.apache.harmony.luni.internal.util.ZoneInfo@7b42d3a7 10-07 17:03:40.422: INFO/System.out(1193): Date :: 20 Oct 2011 04:20:00 GMT 10-07 17:03:40.442: INFO/System.out(1193): Start date :: 2011-10-20 16:20:00 10-07 17:03:40.442: INFO/System.out(1193): Calender's timezon :: GMT+05:30 10-07 17:03:40.442: INFO/System.out(1193): Start date :: yyyy-mm-dd hh:mm:ss 2011-9-20 16:20 10-07 17:03:40.452: INFO/System.out(1193): End date :: Thu Oct 20 16:25:00 Pacific/Fiji 2011 

Si establezco una zona horaria para "América / Tijuana";

 10-06 22:05:20.702: INFO/System.out(1193): Default timezon id :: America/Tijuana 10-06 22:05:20.712: INFO/System.out(1193): Timezon id :: Asia/Calcutta Timezon name :: GMT+05:30 10-06 22:05:20.712: INFO/System.out(1193): TImezon :: org.apache.harmony.luni.internal.util.ZoneInfo@1294e658 10-06 22:05:20.733: INFO/System.out(1193): Date :: 20 Oct 2011 04:20:00 GMT 10-06 22:05:20.742: INFO/System.out(1193): Start date :: 2011-10-19 21:20:00 10-06 22:05:20.742: INFO/System.out(1193): Calender's timezon :: GMT+05:30 10-06 22:05:20.752: INFO/System.out(1193): Start date :: yyyy-mm-dd hh:mm:ss 2011-9-19 21:20 10-06 22:05:20.752: INFO/System.out(1193): End date :: Wed Oct 19 21:25:00 America/Tijuana 2011 

EDITAR

Tengo tiempo en milisegundos ahora estoy mostrando que milisegundos en el formato de fecha en mi aplicación, pero el problema es cuando cambié el huso horario en el dispositivo que obtener la fecha de acuerdo con esa zona horaria.

Una Fecha es sólo un instante en el tiempo universal. No tiene idea de una zona horaria. Piense en ello como "cuando Kennedy fue asesinado".

Cuando muestra este tiempo con SimpleDateFormat , este formato de fecha tiene una zona horaria y muestra este instante en el tiempo utilizando este huso horario. Por lo tanto, si la zona horaria del formato de fecha es la hora estándar central, esta vez se mostrará como 12:30. Si la zona horaria es UTC, se mostrará como 18:30.

Si desea que se muestre una fecha de la misma manera, independientemente de la zona horaria, entonces sólo tiene que elegir una zona horaria específica (UTC, por ejemplo) y mostrar siempre la fecha con esta zona horaria. Por lo tanto, debe llamar a setTimeZone en el DateFormat antes de formatear la fecha.

En Java estándar:

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); sdf.setTimeZone(TimeZone.getTimeZone(<your timezone here>); long millis = <your timestamp here>; //timestamps are not TZ dependent. Date d = new Date(millis); String toDisplay = sdf.format(d); 

La zona horaria de SimpleDateFormat es la zona horaria fija que desea utilizar para cada fecha mostrada, no la predeterminada del dispositivo. Asegúrese también de que la columna de marca de tiempo en su base de datos comience a contar en el mismo punto en tiempo que Java (1/1/1970, AKA Unix) y tiene la misma precisión (milisegundos).

Hay otra clase de android.text.format.DateFormat, pero no veo ningún punto en usarla.

Tengo la solución como el siguiente método

 /** * Date time must be in milliseconds * return Time in milliseconds */ public static String getTimeInMilli(Context ctx, String datetime) { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(Long.parseLong(datetime)); //This will return daylight savings offset in milliseconds.You have to Subtract this milliseconds from calendar int dayLightSaving = cal.get(Calendar.DST_OFFSET); cal.setTimeInMillis(cal.getTimeInMillis() - dayLightSaving); TimeZone z = cal.getTimeZone(); int offset = z.getRawOffset(); int offsetHrs = offset / 1000 / 60 / 60; int offsetMins = offset / 1000 / 60 % 60; // Subtract offset of your current TimeZone cal.add(Calendar.HOUR_OF_DAY, (-offsetHrs)); cal.add(Calendar.MINUTE, (-offsetMins)); cal.setTimeZone(TimeZone.getTimeZone("GMT")); //add offset of your TimeZone cal.add(Calendar.HOUR_OF_DAY, 5); cal.add(Calendar.MINUTE, 30); return String.valueOf(cal.getTimeInMillis()); } 

Ahora si cambio la zona horaria en mi dispositivo la fecha de mi aplicación permanecerá igual.

  • ¿Cómo obtener la compensación horaria en GMT (como GMT + 7: 00) desde el dispositivo Android?
  • Jodatime cómo saber si el horario de verano está en
  • Android cómo obtener diferencia de tiempo entre dos zonas horarias en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.