1. Introduction au fuseau horaire
Le fuseau horaire représente le décalage du fuseau horaire et peut également calculer l'heure d'été.
Le fuseau horaire est souvent utilisé lors du fonctionnement des objets représentant des dates / heures telles que la date, le calendrier, etc.; Parce que différents fuseaux horaires ont des moments différents.
Parlons de deux façons courantes de créer des objets de fuseau horaire.
1. Obtenez l'objet du fuseau horaire par défaut
Comment utiliser:
Timezone tz = timezone.getDefault ()
2. Utilisez la méthode GetTimeZone (String ID) pour obtenir l'objet horaire
Comment utiliser:
// Obtenez le fuseau horaire correspondant à "GMT + 08: 00" Timezone China = Timezone.getTimeZone ("GMT +: 08: 00"); // Obtenez le fuseau horaire correspondant à "China / Chongqing" Timezone Chongqing = Timezone.getTimeZone ("Asia / Chongqing"); Pour les valeurs de tous les paramètres d'ID pris en charge par GetTimeZone (String ID), vous pouvez les trouver de la manière suivante:
String [] ids = timezone.getAvailableID (); for (String id: ids) System.out.printf (id + ",");
Résultat de sortie:
Etc / gmt + 12, etc / gmt + 11, Pacific / Midway, Pacific / niue ... etc.Par exemple, créez le fuseau horaire correspondant à la deuxième valeur d'impression "etc / gmt + 11" ci-dessus. La méthode est la suivante:
Timezone tz = timezone.getTimeZone ("etc / gmt + 11"); Interface de fonction de Fonctionnaire // Constructeur Timezone ():Objet clone () chaîne statique synchronisée [] getavailableids () chaîne statique synchronisée [] getAvailableIDS (int offsetmilli) int getdsavings () Synchronisé static thonzone getDefault () Final String GetDisplayName (Locale Locale) String GetDisplayName (Boolean DaylightTime, intyme, Locale Locale) Final String GetDame (BooleanDlighttimeTime Style Int getDisplayName (boolean daylighttime, int style) string getID () abstract int getoffset (int era, int an, int mois, int day, int dayofweek, int timeofdaymillis) int getoffset (long) abstract intrawoffset () synchronisé static timezone gettimezone (id string booolean sang IndaylightTime (date de date) Synchronisé statique void SetDefault (Timezone Timezone) Void SETID (String ID) abstract void setRawoffset (int offsetMillis) Résumé Boolean UsedaylightTime ()
2. Exemple du fuseau horaire:
Ce qui suit est un exemple pour démontrer l'utilisation du fuseau horaire à la date.
Le code de référence est le suivant (timezoneTest.java):
Importer java.text.dateFormat; import java.util.date; import java.util.timezone; / ** * Programme de test de la classe publique / classe publique TimezonETest {public static void main (String [] args) {// test 3 méthodes pour créer des objets horodatriques showUsageFimeZones (); // tester d'autres API de Timezone Testotheapis (); // Imprime tous les ID pris en charge par getTimeZone (String ID) // printAllTimeZones (); } / ** * Tester 3 Méthodes pour créer des objets de zones horaires * / public static void showUsageOftimeZones () {timezone tz; // (01) Fuseau horaire par défaut tz = timezone.getDefault (); printdatein (tz); // (02) Définissez le fuseau horaire sur "GMT + 08: 00" TZ = Timezone.getTimeZone ("GMT + 08: 00"); printdatein (tz); // (03) Définissez le fuseau horaire sur "" tz = timezone.getTimeZone ("Asia / Chongqing"); printdatein (tz); } / ** * Imprimez la date / heure correspondant à tz * / private static void printdatein (Timezone tz) {// date est 2013-09-19 14:22:30 Date de date = nouvelle date (113, 8, 19, 14, 22, 30); // Obtenez la date de défaut DateFormat pour le formatage Date DateFormat df = dateFormat.getInstance (); // Définissez le fuseau horaire sur TZ DF.SetTimeZone (TZ); // Obtenez la chaîne de chaîne formatée str = df.format (date); System.out.println (tz.getID () + ":" + str); } / ** * Tester les autres API de Timezone * / public static void testotherapis () {// Timezone du fuseau horaire par défaut tz = timezone.getDefault (); // Get "id" String id = tz.getId (); // Get "Affichage Name" String name = tz.getDisplayName (); // Obtenez "Offset de temps". Le décalage par rapport au "Meridian primaire" est MS. int offset = tz.getrawoffset (); // Obtenez l'heure correspondante de "décalage de temps" int gmt = offset / (3600 * 1000); System.out.printf ("id =% s, name =% s, offset =% s (ms), gmt =% s / n", id, nom, offset, gmt); } / ** * Imprimez tous les ID pris en charge par getTimeZone (String ID) * / public static void printallTimeZones () {String [] ids = timezone.getAcAnAidableID (); for (String id: ids) {// int offSet = timeZone.getTimeZone (AvAids [i]). getrawoffset (); //System.out.println(i+ "" + avaids [i] + "" + offset / (3600 * 1000) + "/ t"); System.out.printf (id + ","); } System.out.println (); }}
3. About de fuseau horaire et d'étalonnage temporel
Java et Solaris sont très similaires en ce qui concerne les informations sur les fuseaux horaires. Chaque fuseau horaire a un identifiant d'ID de fuseau horaire. Dans J2SE 1.3 et 1.4, cet ID est une chaîne, qui est une liste de ces ID situés dans le sous-répertoire JRE / Lib du programme d'installation J2SE. J2SE 1.3 ne contient que des fichiers TZMappings, mais J2SE 1.4 contient des fichiers de données de fuseau horaire dans différentes régions du monde. JRE / lib / zi stocke ces fichiers. Dans J2SE 1.4, Sun.util.calendar.zoneinfo obtient des règles DST de ces fichiers. Dans Solaris, ces fichiers de données de fuseau horaire sont stockés sous forme binaire et ne sont pas des fichiers texte, vous ne pouvez donc pas les regarder. Le fichier de données du fuseau horaire dans J2SE 1.4 est différent de celui de Solaris.
Le code source de la méthode GetDefault dans la classe java.util.timezone montre qu'il appellera éventuellement la méthode GetTimeZone de la classe Sun.util.calendar.zoneinfo. Cette méthode renvoie un paramètre de chaîne en tant qu'ID pour la zone de temps requise. Cet ID de fuseau horaire par défaut est obtenu à partir de la propriété User.TimeZone (système). Si User.TimeZone n'est pas défini, il essaiera d'obtenir l'ID des propriétés User.Country et Java.Home (système). S'il ne trouve pas avec succès un ID de fuseau horaire, il utilise une valeur GMT "Fallback". En d'autres termes, s'il ne calcule pas votre ID de fuseau horaire, il utilisera GMT comme fuseau horaire par défaut.
Notez que la propriété système est initialisée dans la méthode InitProperties de la classe java.lang.System. Il s'agit d'une méthode locale. Par conséquent, le code source n'est pas disponible - à moins de creuser dans la base de code locale dans le package de distribution J2SE pour étudier. Cependant, dans Windows Systems, l'attribut système est initialisé à partir du registre Windows, tandis que dans Linux / Unix, il est initialisé par les variables d'environnement. La déclaration Javadoc de la méthode InitProperties, certaines propriétés "doivent être garanties pour être définies" et les énumérer. Sur les trois propriétés du système utilisées par la méthode GetDefault de la classe Java.util.TimeZone, seul java.home est répertorié dans Javadoc en tant que propriété "garantie".
Solutions recommandées:
Alors, comment vous assurez-vous que Java vous donne le bon moment et la bonne date? La meilleure façon est de confirmer que la classe de fuseau horaire par défaut de Java Virtual Machine (JVM) est correcte et convient à votre portée géographique (paramètres régionaux). Comment vous assurez-vous que le fuseau horaire par défaut est correct et approprié? Ceci est un autre nouveau problème. Comme la plupart des problèmes traités, cela a de nombreuses solutions. Selon le code source de la méthode java.util.timezone.getDefault, la meilleure façon est de définir correctement la propriété user.timeZone. Lors du démarrage de la machine virtuelle Java, vous pouvez facilement remplacer la valeur définie dans la méthode java.lang.system.initproperties en utilisant le paramètre de ligne de commande -D. Par exemple:
Java -Duser.TimeZone = Asie / Shanghai DateTest
Cette commande démarre la classe DateTest et définit la propriété user.timeZone vers Asie / Shanghai. Vous pouvez également définir la propriété User.TimeZone en utilisant la méthode SetProperty de la classe Java.lang.System:
System.SetProperty ("User.TimeZone", "Asia / Shanghai");S'il n'y a pas d'identification de fuseau horaire disponible pour vous, vous pouvez créer un fuseau horaire personnalisé en utilisant la méthode SetDefault de la classe java.util.timezone pour le définir sur l'heure par défaut zone-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
N'oubliez pas que dans J2SE, la plupart des classes liées à la date et au temps contiennent des informations de fuseau horaire, y compris les classes de format, telles que Java.Text.DateFormat, elles sont donc toutes affectées par le fuseau horaire par défaut du JVM. Cependant, lorsque vous créez des instances de ces classes, vous pouvez vous assurer les informations de fuseau horaire correctes, ce qui vous permet de définir plus facilement le fuseau horaire par défaut de l'ensemble du JVM. Et une fois configuré, vous pouvez vous assurer que toutes ces classes utiliseront le même fuseau horaire par défaut.