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();
}
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));
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 .
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
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();
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
Log.d("Time zone","="+tz.getDisplayName());
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.
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;
}
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;
}
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
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));
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