Je dois enregistrer le fuseau horaire du téléphone au format [+/-] hh: mm
J'utilise la classe TimeZone pour gérer cela, mais le seul format que je puisse obtenir est le suivant:
PST -05:00
GMT +02:00
Je préférerais ne pas sous-chaîne du résultat. Existe-t-il un indicateur de clé ou d'option que je puisse définir pour obtenir uniquement la valeur et non le nom de ce fuseau horaire (GMT/CET/PST ...)?
Je dois enregistrer le fuseau horaire du téléphone au format [+/-] hh: mm
Non, tu ne le fais pas. Offset seul ne suffit pas, vous devez stocker le nom/id du fuseau horaire complet. Par exemple, je vis à Oslo où mon décalage actuel est de +02: 00 mais en hiver (à cause de dst ), il est de +01: 00. Le passage exact entre l'heure normale et l'heure d'été dépend de facteurs que vous ne souhaitez pas explorer.
Ainsi, au lieu de stocker + 02:00
(Ou devrait-il s'agir de + 01:00
?), Je stocke "Europe/Oslo"
Dans ma base de données. Maintenant, je peux restaurer la configuration complète en utilisant:
TimeZone tz = TimeZone.getTimeZone("Europe/Oslo")
Vous voulez savoir quel est mon décalage horaire aujourd'hui?
tz.getOffset(new Date().getTime()) / 1000 / 60 //yields +120 minutes
Cependant le même en décembre:
Calendar christmas = new GregorianCalendar(2012, DECEMBER, 25);
tz.getOffset(christmas.getTimeInMillis()) / 1000 / 60 //yields +60 minutes
Assez à dire: enregistrez le nom ou l'identifiant du fuseau horaire et, chaque fois que vous souhaitez afficher une date, vérifiez quel est le décalage actuel (aujourd'hui) plutôt que de stocker une valeur fixe. Vous pouvez utiliser TimeZone.getAvailableIDs()
pour énumérer tous les ID de fuseau horaire pris en charge.
@MrBean - J'étais dans une situation similaire où je devais appeler un service Web tiers et transmettre le Android décalage du fuseau horaire actuel de l'appareil au format +/- hh: mm. Voici: ma solution:
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;
}
Avec Java8 maintenant, vous pouvez utiliser
Integer offset = ZonedDateTime.now().getOffset().getTotalSeconds();
pour obtenir le décalage horaire actuel du système par rapport à UTC. Ensuite, vous pouvez le convertir dans le format de votre choix. Je l'ai trouvé utile pour mon cas. Exemple: https://docs.Oracle.com/javase/tutorial/datetime/iso/timezones.html
ZoneId here = ZoneId.of("Europe/Kiev");
ZonedDateTime hereAndNow = Instant.now().atZone(here);
String.format("%tz", hereAndNow);
vous donnera une représentation de chaîne normalisée comme "+0300"
Nous pouvons facilement obtenir le décalage en millisecondes d'un TimeZone
avec seulement une instance de TimeZone
et System.currentTimeMillis()
. Ensuite, nous pouvons convertir des millisecondes en n’importe quelle unité de temps de votre choix en utilisant la classe TimeUnit
.
Ainsi:
public static int getOffsetHours(TimeZone timeZone) {
return (int) TimeUnit.MILLISECONDS.toHours(timeZone.getOffset(System.currentTimeMillis()));
}
Ou si vous préférez la nouvelle Java 8 API)
public static ZoneOffset getOffset(TimeZone timeZone) { //for using ZoneOffsett class
ZoneId zi = timeZone.toZoneId();
ZoneRules zr = zi.getRules();
return zr.getOffset(LocalDateTime.now());
}
public static int getOffsetHours(TimeZone timeZone) { //just hour offset
ZoneOffset zo = getOffset(timeZone);
TimeUnit.SECONDS.toHours(so.getTotalSeconds());
}
Je sais que c'est vieux, mais j'ai pensé donner mon avis. Je devais le faire pour un projet au travail et c'était ma solution.
J'ai un objet de construction qui inclut le fuseau horaire à l'aide de la classe TimeZone et je voulais créer des champs zoneId et offset dans une nouvelle classe.
Donc ce que j'ai fait était de créer:
private String timeZoneId;
private String timeZoneOffset;
Ensuite, dans le constructeur, j'ai passé l'objet Building et défini ces champs de la manière suivante:
this.timeZoneId = building.getTimeZone().getID();
this.timeZoneOffset = building.getTimeZone().toZoneId().getId();
Donc, timeZoneId pourrait correspondre à quelque chose comme "EST" et timeZoneOffset à quelque chose comme "-05: 00"
J'aimerais pas que tu ne puisses pas