mundo - diferencia de zona horaria de Android es 1 hora menos de lo esperado
zonas horarias (1)
Lo que necesito es una diferencia horaria entre la zona horaria específica ("Rusia / Moscú") y la hora local del usuario, la diferencia debe ser en horas.
Me encuentro con el problema de que la Diferencia de zonas horarias a veces es falsa calculada. Calculo la diferencia (en horas) entre el desplazamiento local a UTC del dispositivo Android y el desplazamiento remoto a UTC. Para la mayoría de los usuarios está bien ... pero muchos usuarios se están quejando del problema. No puedo reproducirlo en mi teléfono o emuladores. La diferencia de tiempo visualizada "incorrecta" es de 1 hora menos. En Moscú son las 15:00, en Europa 12:00. Pero el usuario ve el desplazamiento de 2 horas aquí está mi código.
String tz="Europe/Moscow"
Calendar mCalendar = new GregorianCalendar();
mCalendar.setTimeZone( TimeZone.getTimeZone(tz));
TimeZone mTimeZone = mCalendar.getTimeZone();
int remote = mTimeZone.getRawOffset()/1000/60/60;
Calendar mCalendar2 = new GregorianCalendar();
TimeZone mTimeZone2 = mCalendar2.getTimeZone();
int local = mTimeZone2.getRawOffset()/1000/60/60;
return local - remote;
Estás cometiendo el error común de equiparar una zona horaria con un desplazamiento de zona horaria . Son dos cosas diferentes. Por favor, lea la wiki de la etiqueta de la zona horaria .
Cuando llama a getRawOffset
, devuelve el desplazamiento estándar para esa zona horaria. Para obtener el desplazamiento que está vigente en un punto determinado en el tiempo, puede usar getOffset
, que toma un parámetro de la marca de tiempo para el punto en el tiempo del que está hablando.
Considere el siguiente código, que devuelve la diferencia que está actualmente en vigencia:
long now = System.currentTimeMillis();
String tz = "Europe/Moscow";
TimeZone mTimeZone = TimeZone.getTimeZone(tz);
int remote = mTimeZone.getOffset(now);
TimeZone mTimeZone2 = TimeZone.getDefault();
int local = mTimeZone2.getOffset(now);
double differenceInHours = (local - remote) / 3600000.0;
return differenceInHours;
Tenga en cuenta un par de cosas:
- No necesitaba una clase de
Calendar
. - Las compensaciones son ambas para el mismo "ahora". Obtendrás diferentes resultados según cuándo lo ejecutes.
- No todas las compensaciones usan un número entero de horas, por lo que esta función debe volverse
double
, noint
. Por ejemplo, pruebeAsia/Kolkata
, que usa UTC + 5: 30 todo el año, oAustralia/Adelaide
, que alterna entre UTC + 9: 30 y UTC + 10: 30.
Considere también usar Joda-Time , que es una forma mucho más robusta de trabajar con el tiempo en Java.