¿Cómo obtener el desplazamiento de la zona horaria en GMT (como GMT + 7: 00) desde un dispositivo Android?

Obtengo la timezone de un dispositivo Android usando este código

 TimeZone tz = TimeZone.getDefault(); String current_Time_Zone = (TimeZone.getTimeZone(tz.getID()).getDisplayName( false, TimeZone.SHORT)) 

Pero siempre me devuelve la timezone como ” IST ” pero quiero obtener la zona horaria en GMT como este GMT+7:00.

Esto podría darle una idea sobre cómo implementarlo a su gusto:

 Calendar mCalendar = new GregorianCalendar(); TimeZone mTimeZone = mCalendar.getTimeZone(); int mGMTOffset = mTimeZone.getRawOffset(); System.out.printf("GMT offset is %s hours", TimeUnit.HOURS.convert(mGMTOffset, TimeUnit.MILLISECONDS)); 

(TimeUnit es “java.util.concurrent.TimeUnit”)

Este código me devuelve el desplazamiento GMT.

 Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.getDefault()); Date currentLocalTime = calendar.getTime(); DateFormat date = new SimpleDateFormat("Z"); String localTime = date.format(currentLocalTime); 

Devuelve la compensación de zona horaria así: +0530

Si usamos SimpleDateFormat a continuación

 DateFormat date = new SimpleDateFormat("z",Locale.getDefault()); String localTime = date.format(currentLocalTime); 

Devuelve la compensación de zona horaria de esta manera: GMT + 05: 30

Aquí hay una solución para obtener la compensación de zona horaria en GMT + 05: 30 este formato

 public String getCurrentTimezoneOffset() { TimeZone tz = TimeZone.getDefault(); Calendar cal = GregorianCalendar.getInstance(tz); int offsetInMillis = tz.getOffset(cal.getTimeInMillis()); String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60)); offset = "GMT"+(offsetInMillis >= 0 ? "+" : "-") + offset; return offset; } 
 public static String timeZone() { Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.getDefault()); String timeZone = new SimpleDateFormat("Z").format(calendar.getTime()); return timeZone.substring(0, 3) + ":"+ timeZone.substring(3, 5); } 

regresa como +03: 30

una solución de una línea es usar el símbolo Z como:

 new SimpleDateFormat(pattern, Locale.getDefault()).format(System.currentTimeMillis()); 

donde el pattern podría ser:

  • Z / ZZ / ZZZ: -0800
  • ZZZZ: GMT-08: 00
  • ZZZZZ: -08: 00

referencia completa aquí:

http://developer.android.com/reference/java/text/SimpleDateFormat.html

 public static String getCurrentTimezoneOffset() { TimeZone tz = TimeZone.getDefault(); Calendar cal = GregorianCalendar.getInstance(tz); int offsetInMillis = tz.getOffset(cal.getTimeInMillis()); String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60)); offset = (offsetInMillis >= 0 ? "+" : "-") + offset; return offset; } 
  TimeZone tz = TimeZone.getDefault(); Calendar cal = GregorianCalendar.getInstance(tz); int offsetInMillis = tz.getOffset(cal.getTimeInMillis()); String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60)); offset = (offsetInMillis >= 0 ? "+" : "-") + offset; 

Otra solución más para obtener el desplazamiento de la zona horaria:

 TimeZone tz = TimeZone.getDefault(); String current_Time_Zone = getGmtOffsetString(tz.getRawOffset()); public static String getGmtOffsetString(int offsetMillis) { int offsetMinutes = offsetMillis / 60000; char sign = '+'; if (offsetMinutes < 0) { sign = '-'; offsetMinutes = -offsetMinutes; } return String.format("GMT%c%02d:%02d", sign, offsetMinutes/60, offsetMinutes % 60); } 

Si alguien está buscando cómo representar el GMT como un número flotante que representa la compensación de horas
(por ejemplo “GMT-0530” a -5.5), puede usar esto:

 Calendar calendar = new GregorianCalendar(); TimeZone timeZone = calendar.getTimeZone(); int offset = timeZone.getRawOffset(); long hours = TimeUnit.MILLISECONDS.toHours(offset); float minutes = (float)TimeUnit.MILLISECONDS.toMinutes(offset - TimeUnit.HOURS.toMillis(hours)) / MINUTES_IN_HOUR; float gmt = hours + minutes; 

Puedes hacer así:

  TimeZone tz = TimeZone.getDefault(); int offset = tz.getRawOffset(); String timeZone = String.format("%s%02d%02d", offset >= 0 ? "+" : "-", offset / 3600000, (offset / 60000) % 60); 
 TimeZone timeZone = TimeZone.getDefault(); String timeZoneInGMTFormat = timeZone.getDisplayName(false,TimeZone.SHORT); 

Salida: GMT + 5: 30

 TimeZone tz = TimeZone.getDefault(); String gmt1=TimeZone.getTimeZone(tz.getID()) .getDisplayName(false,TimeZone.SHORT); String gmt2=TimeZone.getTimeZone(tz.getID()) .getDisplayName(false,TimeZone.LONG); Log.d("Tag","TimeZone : "+gmt1+"\t"+gmt2); 

Vea si esto ayuda 🙂

He estado mirando esto también y tratando de averiguar cómo aplicar la zona horaria y el horario de verano. Aquí está mi código.

  public long applyGMTOffsetDST(long time) { // Works out adjustments for timezone and daylight saving time Calendar mCalendar = new GregorianCalendar(); TimeZone mTimeZone = mCalendar.getTimeZone(); boolean dstBool = mTimeZone.getDefault().inDaylightTime( new Date() ); // add an hour if DST active if (dstBool == true) { time = time + secondsPerHour; } // add offest hours int mGMTOffset = mTimeZone.getRawOffset(); if (mGMTOffset > 0) { long offsetSeconds = secondsPerHour * mGMTOffset; time = time + offsetSeconds; } return time; } 

Esto parece funcionar, pero ¿hay una mejor manera de obtener el tiempo real del dispositivo que representa un momento que sea significativo y preciso para el usuario?

Me encontré con una solución simple para esto en Java8 (no Android) usando la clase ZoneDateTime . Puede haber otras clases que implementen la interfaz TemporalAccessor que funcione, pero no las he encontrado. Esto no funcionará con las clases estándar Date , DateTime , LocalDateTime y Calender hasta donde yo LocalDateTime .

  ZoneOffset myOffset = ZonedDateTime.now().getOffset(); ZoneOffset myOffset2 = ZoneOffset.from(ZonedDateTime.now()); log.info("ZoneOffset is " + myOffset.getId()); // should print "+HH:MM" log.info("ZoneOffset2 is " + myOffset2.getId()); // should print "+HH:MM" 

Lo bueno de esta solución es que evita una gran cantidad de módulo de matemáticas, generación de cadenas y análisis sintáctico.

Agregar el desplazamiento dst resolverá esto:

  int offsetInMillis = TimeZone.getDefault().getRawOffset()+TimeZone.getDefault().getDSTSavings(); String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60)); offset = (offsetInMillis >= 0 ? "+" : "-") + offset; return offset; 

TimeZone timeZone = TimeZone.getTimeZone (“GMT + 7: 00”);

declararlo explícitamente.