web-dev-qa-db-fra.com

Obtenir l'heure actuelle dans un fuseau horaire donné: Android

Je suis nouveau sur Android et je suis actuellement confronté à un problème pour obtenir l'heure actuelle compte tenu du fuseau horaire.

Le fuseau horaire est au format "GMT-7", c’est-à-dire la chaîne . Et j’ai l’heure du système.

Existe-t-il un moyen propre d’obtenir l’heure actuelle dans le fuseau horaire indiqué ci-dessus? Toute aide est appréciée . Merci,

edit: Essayer de faire ceci:

public String getTime(String timezone) {
    Calendar c = Calendar.getInstance();
    c.setTimeZone(TimeZone.getTimeZone(timezone));
    Date date = c.getTime();
    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    String strDate = df.format(date);
    return c.getTime().toString();
}
15
Vishesh Joshi

Je l'ai fait fonctionner comme ceci:

TimeZone tz = TimeZone.getTimeZone("GMT+05:30");
Calendar c = Calendar.getInstance(tz);
String time = String.format("%02d" , c.get(Calendar.HOUR_OF_DAY))+":"+
            String.format("%02d" , c.get(Calendar.MINUTE))+":"+
.                   String.format("%02d" , c.get(Calendar.SECOND))+":"+
    .           String.format("%03d" , c.get(Calendar.MILLISECOND));
19
Vishesh Joshi

Java.time

Les anciennes classes date-heure fournies avec Java et la bibliothèque tierce Joda-Time ont été supplantées par la structure Java.time intégrée à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes de date-heure gênantes telles que Java.util.Date. Voir Tutoriel Oracle . Une grande partie de la fonctionnalité Java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport , puis adaptée à Android dans ThreeTenABP .

En passant, ne faites jamais référence à un offset-par-UTC avec un seul chiffre d'heures, tel que -7, car il s'agit d'une norme non standard qui sera incompatible avec divers protocoles et bibliothèques. Toujours compléter avec un zéro pour le deuxième chiffre, tel que -07

Si tout ce que vous avez est un décalage plutôt qu'un fuseau horaire, utilisez la classe OffsetDateTime.

ZoneOffset offset = ZoneOffset.ofHours( -7 );
OffsetDateTime odt = OffsetDateTime.now( offset );
String output1 = odt.toLocalTime().toString();
System.out.println( "Current time in " + offset + ": " + output1 );

Heure actuelle dans -07: 00: 19: 41: 36.525

Si vous avez un fuseau horaire complet, qui correspond à un décalage plus, à un ensemble de règles de traitement des anomalies telles que l'heure d'été (DST), plutôt qu'à un simple décalage par rapport à UTC, utilisez la classe ZonedDateTime.

ZoneId denverTimeZone = ZoneId.of( "America/Denver" );
ZonedDateTime zdt = ZonedDateTime.now( denverTimeZone );
String output2 = zdt.toLocalTime().toString();
System.out.println( "Current time in " + denverTimeZone + ": " + output2 );

Heure actuelle dans/Denver: 20: 41: 36.560

Voir ce code en action dans Ideone.com

Joda-Time

Vous pouvez utiliser Joda-Time 2.7 sous Android. Rend le travail de date-heure beaucoup plus facile.

DateTimeZone zone = DateTimeZone.forID ( "America/Denver" );
DateTime dateTime = new DateTime ( zone );
String output = dateTime.toLocalTime ().toString ();

dump à la console.

System.out.println ( "zone: " + zone + " | dateTime: " + dateTime + " | output: " + output );

Quand couru…

zone: Amérique/Denver | dateTime: 2016-07-11T20: 50: 17.668-06: 00 | sortie: 20: 50: 17.668

Comptez depuis l'époque

Je recommande fortement de ne pas suivre le suivi par temps par nombre-depuis - Epoch . Toutefois, si nécessaire, vous pouvez extraire les millisecondes internes à Joda-Time depuis Epoch ( heure Unix , premier instant de 1970 UTC) en appelant la méthode getMillis sur un DateTime .

Notez l'utilisation de la long 64 bits au lieu de int 32 bits types primitifs .

En Java.time. N'oubliez pas que vous perdez peut-être des données ici, car Java.time conserve une résolution pouvant atteindre les nanosecondes. Passer de nanosecondes à quelques millisecondes signifie tronquer jusqu'à six chiffres d'une fraction décimale de seconde (trois chiffres pour des millisecondes et neuf pour des nanosecondes).

long millis = Instant.now ().toEpochMilli ();

Dans Joda-Time.

long millis = DateTime.now( denverTimeZone ).getMillis();
11
Basil Bourque
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
Log.d("Time zone","="+tz.getDisplayName());
10
Asier Aranbarri

Essaye ça:

SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
df.setTimeZone(TimeZone.getTimeZone("YOUR_TIMEZONE"));
String strDate = df.format(date);

YOUR_TIMEZONE peut ressembler à quelque chose comme: GMT, UTC, GMT-5, etc.

6
Flávio Faria

Définissez le fuseau horaire sur Formatter, et non sur le calendrier:

public String getTime(String timezone) {
    Calendar c = Calendar.getInstance();
    Date date = c.getTime(); //current date and time in UTC
    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    df.setTimeZone(TimeZone.getTimeZone(timezone)); //format in given timezone
    String strDate = df.format(date);
    return strDate;
}
5
igork

Oui, vous pouvez. En appelant la méthode TimeZone setDefault().

public String getTime(String timezone) {
    TimeZone defaultTz = TimeZone.getDefault();

    TimeZone.setDefault(TimeZone.getTimeZone(timezone));
    Calendar cal = Calendar.getInstance();
    Date date = cal.getTime();
    String strDate = date.toString();

    // Reset Back to System Default
    TimeZone.setDefault(defaultTz);

    return strDate;
}
3
Tang Chanrith

J'ai trouvé un moyen meilleur et plus simple.

Premier fuseau horaire de l'application utilisant

    TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));

Et appelez ensuite Calander pour obtenir la date en interne; il utilise le fuseau horaire par défaut défini par l’application ci-dessus.

     Calendar cal = Calendar.getInstance();
     Log.d("Los angeles time   ",cal.getTime().toString());

Il donnera l'heure actuelle en fonction du fuseau horaire.

D/Heure de Los Angeles: jeu. 21 juin 13:52:25 PDT 2018

1
Justcurious
 TimeZone tz = TimeZone.getTimeZone(TimeZoneID);
 Calendar c= Calendar.getInstance(tz);
 String time=new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date(cal.getTimeInMillis()));

TimeZoneID peut être un en bas selon votre choix

String[] ids=TimeZone.getAvailableIDs();

alors le temps peut être obtenir selon la réponse acceptée ci-dessus

String time = String.format("%02d" , c.get(Calendar.HOUR_OF_DAY))+":"+
            String.format("%02d" , c.get(Calendar.MINUTE))+":"+
                  String.format("%02d" , c.get(Calendar.SECOND))+":"+
               String.format("%03d" , c.get(Calendar.MILLISECOND));
1
Rajesh Nasit

Le moyen le plus propre est avec SimpleDateFormat

SimpleDateFormat = SimpleDateFormat("MMM\nd\nh:mm a", Locale.getDefault())

ou vous pouvez spécifier les paramètres régionaux

0
Kyle