Comment obtenir TimeZone depuis un mobile Android?

140

Je souhaite obtenir le fuseau horaire du mobile Android en cliquant sur un bouton.

asha v
la source
11
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); Et c'est le code
asha v
10
Je ne serais pas si dur avec asha v. Je cherchais juste la même chose et les réponses que j'ai trouvées étaient différentes de celles-ci. En fait, la recherche par le "TimeZone.getDefault" exact m'a conduit ici.
Yar

Réponses:

189

Avez-vous essayé d'utiliser TimeZone.getDefault():

La plupart des applications utiliseront TimeZone.getDefault () qui renvoie une TimeZone basée sur le fuseau horaire où le programme est en cours d'exécution.

Réf: http://developer.android.com/reference/java/util/TimeZone.html

MasterCassim
la source
22
Si vous utilisez JodaTime , vous pouvez obtenir une DateTimeZone avec les éléments suivants:DateTimeZone.forTimeZone(TimeZone.getDefault());
Joshua Pinter
@JoshPinter quel package dois-je utiliser, celui sur android.icu.utils ou le java.util?
Neon Warge
1
J'ai changé le fuseau horaire de l'appareil en CST, cela ne me rend pas CST. Existe-t-il un moyen d'obtenir le fuseau horaire de l'appareil?
Abhinav Saxena
Je me demande si TimeZone.getDefault est affecté si nous simulons en quelque sorte le fuseau horaire de l'appareil. Cela ne semble pas être sur le simulateur Android.
Hau Luu
@NeonWarge Both fonctionnera, bien que android.icu ne fonctionne que pour l'API 24 et plus.
Nicolas
136
TimeZone tz = TimeZone.getDefault();
System.out.println("TimeZone   "+tz.getDisplayName(false, TimeZone.SHORT)+" Timezon id :: " +tz.getID());

Production:

TimeZone GMT + 09: 30 Identifiant du fuseau horaire :: Australia / Darwin

Zulfiqar
la source
@Flexo Comment obtenir l'horodatage d'un appareil Android
KOUSIK Daniel
4
grande explication avec sortie
Anand Savjani
14

J'avais besoin du décalage qui incluait non seulement l'heure de la lumière du jour, mais aussi un numéro . Voici le code que j'ai utilisé au cas où quelqu'un chercherait un exemple.

J'obtiens une réponse de "3,5" (3h30 '), ce à quoi je m'attendrais à Téhéran, en Iran en hiver et de "4,5" (4h30') pour l'été.

J'en avais également besoin sous forme de chaîne pour pouvoir le publier sur un serveur afin que vous n'ayez pas besoin de la dernière ligne.

pour obtenir le fuseau horaire actuel:

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
la source
1
Cela a fonctionné pour moi car je ne traitais que des durées (comme un chronomètre).
Ahsan
13

Essayez ce code-

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

Il renverra le fuseau horaire sélectionné par l'utilisateur.

anujprashar
la source
4
Créer un Calendarobjet pour cela est un non-sens. La création de ce type d'objet est coûteuse. TimeZone.getDefault()est le moyen approprié pour y parvenir.
anonyme le
3
@KrLx_roller Veuillez vérifier attentivement avant de voter pour la réponse. J'ai écrit ma réponse renvoie le fuseau horaire sélectionné par l'utilisateur alors que TimeZone.getDefault () renverra le fuseau horaire par défaut de l'installation. Pour plus d'informations, veuillez code.google.com/p/android/issues/detail?id=2037 .
anujprashar
Votre code renvoie le même fuseau horaire que TimeZone.getDefault () sur Android 4.2. TimeZone.getDefault () renverra le fuseau horaire sélectionné dans les paramètres -> date et heure.
user1088166
5
TimeZone timeZone = TimeZone.getDefault(); 
timeZone.getID();

Il imprimera comme

Asia/Kolkata
Raja Jawahar
la source
3

Solution la plus simple avec un format de date 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 sortie est: +05: 30

Jaydeep purohit
la source
2

ZoneId de java.time et ThreeTenABP

Réponse moderne:

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

Lorsque j'ai exécuté cet extrait de code dans le fuseau horaire Australie / Sydney, la sortie était exactement la suivante:

Australia/Sydney

Si vous voulez le nom ou l'abréviation du fuseau horaire compatible avec l'heure d'été (DST):

    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 TimeZoneclasse utilisée dans la plupart des autres réponses était celle que nous avions lorsque la question a été posée en 2011, même si elle était mal conçue. Aujourd'hui, il est obsolète depuis longtemps, et je recommande d'utiliser à la place java.time, l'API Java de date et d'heure moderne qui est sortie en 2014.

Question: java.time ne nécessite-t-il pas le niveau d'API Android 26?

java.time fonctionne bien sur les appareils Android plus anciens et plus récents. Il nécessite juste au moins Java 6 .

  • Dans Java 8 et versions ultérieures et sur les appareils Android plus récents (à partir du niveau d'API 26), l'API moderne est intégrée.
  • Dans Java 6 et 7 non-Android, obtenez le ThreeTen Backport, le backport des classes modernes (ThreeTen pour JSR 310; voir les liens en bas).
  • Sur Android (plus ancien), utilisez l'édition Android de ThreeTen Backport. Il s'appelle ThreeTenABP. Et assurez-vous d'importer les classes de date et d'heure à partir des org.threeten.bpsous-packages.

Liens

Ole VV
la source
1

Pour les appareils avec l'API 26 et plus, vous pouvez l'obtenir comme ceci:

ZonedDateTime.now().getZone().toString();
Maciej Beimcik
la source
1

Sur mon appareil, le TimeZone.getDefault()fuseau horaire UTC est toujours renvoyé.

Je dois faire ceci pour obtenir le fuseau horaire configuré par l'utilisateur:

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

Il renverra le fuseau horaire sélectionné par l'utilisateur.

Bipi
la source
0

Toutes les réponses ici semblent suggérer de définir le paramètre daylite sur false . Ceci est incorrect pour de nombreux fuseaux horaires qui changent de noms abrégés en fonction de la période de l'année (par exemple EST vs EDT).

La solution ci-dessous vous donnera l'abréviation correcte en fonction de la date actuelle du fuseau horaire.

val tz = TimeZone.getDefault()
val isDaylite = tz.inDaylightTime(Date())
val timezone = tz.getDisplayName(isDaylite, TimeZone.SHORT)
Données factices
la source
La TimeZoneclasse est mal conçue et obsolète depuis longtemps.
Ole VV