2011-10-07 13 views
12

Tengo tiempo en milisegundos y estoy mostrando esa hora en mi aplicación en el formato "MM/dd/yyyy HH:mm:ss", está funcionando bien.Problema de zona horaria en Android

Problema: si cambio la zona horaria en el dispositivo Android que muestra el 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 ya que está en cualquier zona horaria.

estoy usando a continuación código para probar asunto 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 fijo de zona horaria "Pacífico/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 :: [email protected] 
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 fijo de zona horaria "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 :: [email protected] 
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 formato de fecha en mi solicitud, pero problema es cuando he cambiado de zona horaria en el dispositivo consigo fecha de acuerdo a la zona horaria.

+0

puede agregar (cal.get (Calendar.MONTH) +1) en la línea de impresión?y aún confunde de qué se trata tu consulta? – jazz

+0

@Shahzeb ¿Qué es esto? – Dharmendra

+0

@jazz Puedes ver la salida cuando cambio la salida timezon es diferente que no quiero quiere decir quiero la misma fecha y hora que la entrada – Dharmendra

Respuesta

12

A La fecha es solo un instante en el tiempo universal. No tiene noción de una zona horaria. Piénselo como "cuando mataron a Kennedy".

Cuando se muestra esta vez con SimpleDateFormat, este formato de fecha tiene una zona horaria, y se muestra este instante en el tiempo utilizando esta zona horaria. 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 solo tiene que elegir una zona horaria específica (UTC, por ejemplo) y siempre mostrar la fecha con esta zona horaria. Por lo tanto, debe llamar al setTimeZone en el DateFormat antes de formatear la fecha.

+0

Pero si deseo utilizar el Calendario, ¿cómo puedo solucionar este problema? Por favor, ayúdenme – Dharmendra

+2

Un calendario es una envoltura alrededor de una fecha. Llame a getTime(), y obtendrá una fecha. –

+0

Muchas gracias, hombre, obtengo la solución – Dharmendra

4

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 en el SimpleDateFormat es la zona horaria fija que desea utilizar para cada fecha que se muestra, no viene por defecto del dispositivo. También asegúrese de que la columna de marca de tiempo en su base de datos comience a contar en el mismo momento que Java (1/1/1970, AKA Unix epoch), y tiene la misma precisión (milisegundos).

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

+0

SimpleDateFormat utiliza la zona horaria.Miré tu camino pero no resolvió mi problema – Dharmendra

+1

Tiene que funcionar. Debes establecer una zona horaria fija (siempre la misma). Por ejemplo, para mostrar fechas en India, use India TZ. Cuando el dispositivo TZ cambia, la salida debe ser la misma. –

+0

Sí, está funcionando, pero si quiero usar el calendario, entonces, ¿cómo puedo solucionar este problema? – Dharmendra

3

tengo la solución, como a continuación 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 de zona horaria en mi dispositivo fecha de la voluntad de mi aplicación sigue siendo igual.

Cuestiones relacionadas