web-dev-qa-db-fra.com

ID TimeZone dans Java

J'ai un problème bizarre avec Java TimeZone ..

L'appel TimeZone.getDefault () donne mon fuseau horaire local, qui a un ID "GMT + 02: 00". Ce qui est drôle, c'est que cet ID n'apparaît pas dans une liste fournie par TimeZone.getAvailableIDs (). Apparemment, ma zone semble être "Etc/GMT + 2".

J'essaie de remplir un combo avec des fuseaux horaires, mais il est impossible de mettre une sélection car GMT + 02: 00 n'est pas dans la liste. Quelqu'un a vu ce problème? Des idées?


Mettre à jour:

L'essentiel est - ne peut pas compter sur les chaînes d'ID, doit aller avec le décalage car les ID d'affichage peuvent varier d'un système à l'autre.

22
Dima

En repensant à d'autres SO questions, cela semble être un problème Java-sur-Windows. Veuillez consulter cet article , en particulier la réponse 1, qui pointe vers un lien wikipedia qui peut résoudre votre problème de cartographie.

4
Andreas_D

GMT + 02: 00 est un ID personnalisé, il n'apparaîtra pas dans la sortie de TimeZone.getAvailableIDs() (qui est énorme). Ce que vous pourriez faire, c'est de demander à l'utilisateur de spécifier son décalage d'abord, puis d'obtenir les ID disponibles pour le décalage donné. Par exemple, pour GMT + 02: 00, le code suivant:

for (String string : TimeZone.getAvailableIDs(TimeZone.getTimeZone(
        "GMT+02:00").getRawOffset())) {
    System.out.println(string);
}

donne la sortie suivante:

 ART 
 Afrique/Blantyre 
 Afrique/Bujumbura 
 Afrique/Le Caire 
 Afrique/Gaborone 
 Afrique/Harare 
 Afrique/Johannesburg 
 Afrique/Kigali 
 Afrique/Lubumbashi 
 Afrique/Lusaka 
 Afrique/Maputo 
 Afrique/Maseru 
 Afrique /Mbabane[.____. E5EAfrica/Tripoli[.____. 
 Asie/Jérusalem 
 Asie/Nicosie 
 Asie/Tel_Aviv 
 CAT 
 EET 
 Égypte 
 Etc/GMT -2 
 Europe/Athènes 
 Europe/Bucarest 
 Europe/Chisinau 
 Europe/Helsinki 
 Europe/Istanbul 
 Europe/Kaliningrad 
 Europe/Kiev 
 Europe/Mariehamn 
 Europe/Minsk 
 Europe/Nicosie 
 Europe/Riga 
 Europe/Simferopol 
 Europe/Sofia 
 Europe/Tallinn 
 Europe/Tiraspol 
 Europe/Oujgorod 
 Europe/Vilnius 
 Europe/Zaporozhye 
 Israël 
 Libye 
 Turquie 

C'est encore gros mais humainement navigable cette fois.

33
Pascal Thivent

Le temps Joda a une constante DateTimeZone.UTC. Cette classe ou constante pourrait vous être utile. http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTimeZone.html

MISE À JOUR Java 8

Java 8 a également maintenant ZoneOffset.UTC: https://docs.Oracle.com/javase/8/docs/api/Java/time/ZoneOffset.html#UTC

2
Kirby

Que diriez-vous d'utiliser TimeZone.getAvailableIDs () et de les regrouper par la partie avant la barre oblique et d'en faire une sélection en deux étapes?

2
fforw

Tout fuseau horaire peut être spécifié comme "GMT" plus/moins un décalage. Le doc fuseau horaire fait référence à cela comme un "ID personnalisé".

Pour remplir un menu déroulant, je pense que vous feriez mieux de proposer une liste spécifique de villes/décalages, avec une association au fuseau horaire. Le tableau retourné par getAvailableIDs() est énorme - 586 entrées dans mon installation - et vous ne voulez certainement pas forcer vos utilisateurs à parcourir cela.

1
kdgregory