¿Cómo obtener TimeZone desde un dispositivo móvil Android?

140

Quiero obtener la zona horaria del dispositivo móvil Android cuando hago clic en un botón.

asha v
fuente
11
TimeZone tz = TimeZone.getDefault (); Cadena gmt1 = TimeZone.getTimeZone (tz.getID ()). GetDisplayName (false, TimeZone.SHORT); Cadena gmt2 = TimeZone.getTimeZone (tz.getID ()). GetDisplayName (false, TimeZone.LONG); Log.d ("Etiqueta", "Zona horaria:" + gmt1 + "\ t" + gmt2); Y este es el código
Asha v
10
No sería tan rudo con asha v. Solo estaba buscando lo mismo y las respuestas que encontré fueron diferentes a estas. En realidad, la búsqueda por el "TimeZone.getDefault" exacto me llevó aquí.
Yar

Respuestas:

189

¿Has intentado usar TimeZone.getDefault():

La mayoría de las aplicaciones usarán TimeZone.getDefault () que devuelve una TimeZone basada en la zona horaria donde se ejecuta el programa.

Ref: http://developer.android.com/reference/java/util/TimeZone.html

MasterCassim
fuente
22
Si está utilizando JodaTime , puede obtener una DateTimeZone con lo siguiente:DateTimeZone.forTimeZone(TimeZone.getDefault());
Joshua Pinter
@JoshPinter, ¿qué paquete utilizo, el de android.icu.utils o el java.util?
Neon Warge
1
Cambié la zona horaria del dispositivo a CST, no me devuelve CST. ¿Hay alguna forma de obtener la zona horaria del dispositivo?
Abhinav Saxena
Me pregunto si TimeZone.getDefault se verá afectado si de alguna manera falsificamos la zona horaria del dispositivo. Parece que no está en el simulador de Android.
Hau Luu
@NeonWarge Ambos funcionarán, aunque android.icu solo funciona para API 24 y superior.
Nicolas
136
TimeZone tz = TimeZone.getDefault();
System.out.println("TimeZone   "+tz.getDisplayName(false, TimeZone.SHORT)+" Timezon id :: " +tz.getID());

Salida:

TimeZone GMT + 09: 30 Identificación de Timezon :: Australia / Darwin

Zulfiqar
fuente
@Flexo cómo obtener la marca de tiempo del dispositivo Android
KOUSIK daniel
44
gran explicación con salida
Anand Savjani
14

Necesitaba la compensación que no solo incluía el horario de verano sino también como un número . Aquí está el código que usé en caso de que alguien esté buscando un ejemplo.

Recibo una respuesta de "3.5" (3:30 ') que es lo que esperaría en Teherán, Irán en invierno y "4.5" (4:30') para el verano.

También lo necesitaba como una cadena para poder publicarlo en un servidor para que no necesite la última línea.

para obtener la zona horaria correcta:

TimeZone tz = TimeZone.getDefault();
Date now = new Date();
//Import part : x.0 for double number
double offsetFromUtc = tz.getOffset(now.getTime()) / 3600000.0;
String m2tTimeZoneIs = Double.parseDouble(offsetFromUtc);
Adnan Abdollah Zaki
fuente
1
Funcionó para mí ya que solo estaba lidiando con duraciones (como cronómetro).
Ahsan
13

Prueba este código

Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();

Devolverá la zona horaria seleccionada por el usuario.

anujprashar
fuente
44
Crear un Calendarobjeto para esto es una tontería. La creación de este tipo de objeto es costosa. TimeZone.getDefault()es la forma adecuada de obtener esto.
Anónimo
3
@KrLx_roller Por favor, verifique cuidadosamente antes de rechazar la respuesta. He escrito mi respuesta devuelve la zona horaria seleccionada por el usuario, mientras que TimeZone.getDefault () devolverá la zona horaria predeterminada de instalación. Para obtener más información, code.google.com/p/android/issues/detail?id=2037 .
anujprashar
Su código devuelve la misma zona horaria que TimeZone.getDefault () en Android 4.2. TimeZone.getDefault () devolverá la zona horaria seleccionada en la configuración -> fecha y hora.
user1088166
5
TimeZone timeZone = TimeZone.getDefault(); 
timeZone.getID();

Se imprimirá como

Asia/Kolkata
Raja Jawahar
fuente
3

Solución más simple con formato de fecha simple: SimpleDateFormat ("ZZZZZ"):

 Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
                Locale.getDefault());
        Date currentLocalTime = calendar.getTime();

        DateFormat date = new SimpleDateFormat("ZZZZZ",Locale.getDefault());
        String localTime = date.format(currentLocalTime);
        System.out.println(localTime+ "  TimeZone   " );

==> La salida es: +05: 30

Jaydeep purohit
fuente
2

ZoneId de java.time y ThreeTenABP

Respuesta moderna:

    ZoneId zone = ZoneId.systemDefault();
    System.out.println(zone);

Cuando ejecuté este fragmento en la zona horaria de Australia / Sydney, el resultado fue exactamente eso:

Australia/Sydney

Si desea que el horario de verano (DST) conozca el nombre o la abreviatura de la zona horaria:

    DateTimeFormatter longTimeZoneFormatter = DateTimeFormatter.ofPattern("zzzz", Locale.getDefault());
    String longTz = ZonedDateTime.now(zone).format(longTimeZoneFormatter);
    System.out.println(longTz);

    DateTimeFormatter shortTimeZoneFormatter = DateTimeFormatter.ofPattern("zzz", Locale.getDefault());
    String shortTz = ZonedDateTime.now(zone).format(shortTimeZoneFormatter);
    System.out.println(shortTz);
Eastern Summer Time (New South Wales)
EST

La TimeZoneclase utilizada en la mayoría de las otras respuestas era la que teníamos cuando se hizo la pregunta en 2011, a pesar de que estaba mal diseñada. Hoy está obsoleto desde hace mucho tiempo, y recomiendo que en su lugar usemos java.time, la API moderna de fecha y hora de Java que salió en 2014.

Pregunta: ¿java.time no requiere el nivel 26 de la API de Android?

java.time funciona bien en dispositivos Android más antiguos y más nuevos. Solo requiere al menos Java 6 .

  • En Java 8 y versiones posteriores y en dispositivos Android más nuevos (desde el nivel 26 de API), la API moderna viene incorporada.
  • En Java 6 y 7 que no sean Android, obtenga ThreeTen Backport, el backport de las clases modernas (ThreeTen para JSR 310; vea los enlaces en la parte inferior).
  • En Android (anterior) use la edición de Android de ThreeTen Backport. Se llama ThreeTenABP. Y asegúrese de importar las clases de fecha y hora org.threeten.bpcon subpaquetes.

Enlaces

Ole VV
fuente
1

Para dispositivos con API 26 y superior, puede obtenerlo así:

ZonedDateTime.now().getZone().toString();
Maciej Beimcik
fuente
1

En mi dispositivo TimeZone.getDefault()siempre regresa la zona horaria UTC.

Necesito hacer esto para obtener la zona horaria configurada por el usuario:

TimeZone.setDefault(null)
val tz = TimeZone.getDefault()

Devolverá la zona horaria seleccionada por el usuario.

Bipi
fuente
0

Todas las respuestas aquí parecen sugerir establecer el parámetro daylite en falso . Esto es incorrecto para muchas zonas horarias que cambian los nombres abreviados según la época del año (por ejemplo, EST frente a EDT).

La solución a continuación le dará la abreviatura correcta de acuerdo con la fecha actual para la zona horaria.

val tz = TimeZone.getDefault()
val isDaylite = tz.inDaylightTime(Date())
val timezone = tz.getDisplayName(isDaylite, TimeZone.SHORT)
Datos ficticios
fuente
La TimeZoneclase está mal diseñada y anticuada desde hace mucho tiempo.
Ole VV