web-dev-qa-db-fra.com

Comment obtenir l'heure et la fuseau horaire actuelles de Locale?

J'ai ce problème étrange, lorsque je crée un calendrier avec un paramètre régional, la TimeZone revient simplement à la locale

public void start(Locale locale){
    String s = locale.getDisplayName(); 
    System.err.println(s);
    Calendar c = new GregorianCalendar(locale);
    System.err.println(c.getTimeZone());
}

Et voici la sortie:

 español (Argentina)
 Sun.util.calendar.ZoneInfo[id="Europe/Bucharest", //etc more useless date here....

Comment puis-je obtenir l'heure appropriée à partir d'un lieu spécifique?

18

La réponse courte: vous ne pouvez pas.

La réponse longue: il n'existe pas de "fuseau horaire approprié pour un lieu". C'est simplement parce qu'il y a quelques pays qui ont plus d'un fuseau horaire (par exemple les États-Unis). Le fuseau horaire est un concept différent.

Quoi qu'il en soit, vous cherchez à résoudre votre problème. Je suppose que vous écrivez une application Web et vous voyez que le fuseau horaire revient au serveur par défaut. Voilà une situation typique. Locale.getDefault() et TimeZone.getDefault() renverront des informations relatives au serveur. La JVM n'a aucun moyen de connaître le "bon" fuseau horaire. Alors, que pouvez-vous y faire?

  1. Vous pouvez ajouter des informations de fuseau horaire au profil utilisateur (si vous en avez un) ou créer une zone de liste déroulante de fuseau horaire (afin que l'utilisateur puisse basculer au moment de l'exécution). Ensuite, vous pouvez affecter un objet approprié à l'instance DateFormat et il convertira automatiquement le fuseau horaire.
  2. Vous pouvez lire le actuel décalage de fuseau horaire du client via l'objet de date JavaScript getTimezoneOffset () fonction et en quelque sorte (AJAX) l'envoyer au serveur. Le problème avec cette méthode est qu'il existe plusieurs fuseaux horaires avec ce décalage, et le fuseau horaire sélectionné peut être inapproprié pour d'autres dates. Bien sûr, vous pouvez deviner le fuseau horaire en interrogeant les données autour de la date de changement d'heure, mais ce n'est probablement pas ce que vous voulez faire.
  3. Vous pouvez envoyer l'heure non formatée au client (par exemple écrite comme format date-heure ISO 8601 ou comme heure Unix de l'époque par rapport à UTC) et avoir - Globaliser ou Dojo formatez la date et l'heure pour vous.

Parmi ces trois choix possibles, j'opte toujours pour le numéro 1. En mettant des informations de fuseau horaire dans le profil de l'utilisateur, vous savez avec certitude quel est son fuseau horaire préféré, quel que soit son navigateur Web actuel, etc. Veuillez garder à l'esprit que certains utilisateurs voudront peut-être utiliser votre application tout en visitant d'autres pays ...

41
Paweł Dyda