1. Introducción a la zona horaria
La zona horaria representa el desplazamiento de la zona horaria y también puede calcular el tiempo de ahorro de verano.
La zona horaria a menudo se usa al operar objetos que representan fechas/horarios como fecha, calendario, etc.; Porque diferentes zonas horarias tienen diferentes tiempos.
Hablemos de dos formas comunes de crear objetos de zona horaria.
1. Obtenga el objeto de zona horaria predeterminada
Cómo usar:
TimeZone TZ = TimeZone.getDefault ()
2. Use el método GetTimeZone (ID de cadena) para obtener el objeto TimeZone
Cómo usar:
// Obtenga la zona horaria correspondiente a "GMT+08: 00" TimeZone China = TimeZone.getTimezone ("GMT+: 08: 00"); // Obtenga la zona horaria correspondiente a "China/Chongqing" Timelone Chongqing = TimEzone.GetTimezone ("Asia/Chongqing"); Para los valores de todos los parámetros de ID admitidos por GetTimageNone (ID de cadena), puede encontrarlos de las siguientes maneras:
String [] ids = TimeZone.getAVailableIds (); for (String ID: IDS) System.out.printf (id+",");
Resultado de salida:
Etc/gmt+12, etc/gmt+11, Pacific/Midway, Pacific/niue ... etc.Por ejemplo, cree la zona horaria correspondiente al segundo valor de impresión "etc/gmt+11" arriba. El método es el siguiente:
TimeZone TZ = TimeZone.GetTimezone ("etc/gmt+11"); interfaz de función de timone // constructor TimeZone ():Objeto clone () cadena estática sincronizada [] getAvailableIds () Sincronización sincronizada de cadena estática [] getAVailableIds (int offSetMillis) int getDStSavings () sincronizado staticzone getDefault () cadena final getDisplayName (locale locale) getDisplayName () Cadena final getDisplayName (boolean daylighttime, int style) string getId () abstract int getoffset (int ERA, int año, int mes, int day, int dayofweek, int timeOfdayMillis) int getOffset (largo tiempo) int resumen getRawOffset () sincronizado tiempo de tiempo estatoso estaticonzone (string ID) boolean hassameMeMeMe) boolean indaylighttime (fecha de fecha) sincronizado void static setDefault (zona horaria) void setid (identificación de cadena) abstracto void setrawoffset (int offsetStetMillis) abstracto boolean usadoaylighttime ()
2. Ejemplo de zona horaria:
El siguiente es un ejemplo para demostrar el uso de la zona horaria en la fecha.
El código de referencia es el siguiente (TimeZonetest.java):
import java.text.dateFormat; import java.util.date; import java.util.timezone;/*** Programa de prueba de TimeZone*/public class Timezonetest {public static void main (string [] args) {// prueba 3 métodos para crear objeto de horario de tiempo timone showusageoftimezones (); // prueba otras API de TimeZone testotherapis (); // Imprime todos los ID admitidos por GetTimezone (ID de cadena) // PrintallTimazones (); } / *** Test 3 Métodos para crear objetos de zona horaria* / public static void showUsageoftimezones () {Timelone tz; // (01) Zona de tiempo predeterminada TZ = TimEzone.getDefault (); printdatein (TZ); // (02) Establezca la zona horaria en "GMT+08: 00" TZ = TimeZone.GetTimezone ("GMT+08: 00"); printdatein (TZ); // (03) Establezca la zona horaria en "" tz = TimeZone.gettimezone ("Asia/Chongqing"); printdatein (TZ); }/*** Imprima la fecha/hora correspondiente a TZ*/Private static void printdatein (TimeZone TZ) {// La fecha es 2013-09-19 14:22:30 Fecha de fecha = nueva fecha (113, 8, 19, 14, 22, 30); // Obtenga el Fecha Fecha predeterminado para Formatear Date DateFormat df = dateFormat.getInstance (); // establecer la zona horaria en TZ DF.SetTimezone (TZ); // Obtener la cadena de cadena formateada str = df.format (fecha); System.out.println (tz.getID ()+":"+str); } / ** * Test TimeZone's Other API * / public static void testotherapis () {// Zona de tiempo predeterminada TimeZone tz = TimeZone.getDefault (); // Obtener "ID" String id = tz.getID (); // Obtener nombre de cadena "Nombre de pantalla" = Tz.getDisplayName (); // Obtener "compensación de tiempo". El desplazamiento en relación con el "Meridiano primario" es MS. int offset = tz.getrawoffset (); // Obtenga la hora correspondiente de "Time Offset" int gmt = offset/(3600*1000); System.out.printf ("id =%s, name =%s, offset =%s (ms), gmt =%s/n", id, nombre, compensación, gmt); } / ** * Imprima todos los ID admitidos por GetTimageNone (ID de cadena) * / public static void PrintallTimazones () {String [] ids = TimEzone.getAVailableIds (); 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. Alrededor de la zona horaria y la calibración de tiempo
Java y Solaris son muy similares cuando se trata de información sobre zonas horarias. Cada zona horaria tiene un identificador de ID de zona horaria. En J2SE 1.3 y 1.4, esta ID es una cadena, que es una lista de estas ID ubicadas en el subdirectorio JRE/lib del instalador J2SE. J2SE 1.3 solo contiene archivos TzMappings, pero J2SE 1.4 contiene archivos de datos de zona horaria en diferentes regiones del mundo. JRE/lib/zi almacena estos archivos. En J2SE 1.4, Sun.util.calendar.zoneinfo obtiene reglas DST de estos archivos. En Solaris, estos archivos de datos de zona horaria se almacenan en forma binaria y no son archivos de texto, por lo que no puede mirarlos. El archivo de datos de la zona horaria en J2SE 1.4 es diferente de la de Solaris.
El código fuente del método GetDefault en la clase Java.util.Timezone muestra que eventualmente llamará al método GetTimeZone de la clase Sun.util.calendar.zoneinfo. Este método devuelve un parámetro de cadena como ID para el área de tiempo requerida. Esta ID de zona horaria predeterminada se obtiene de la propiedad del usuario. TIMEZONE (SISTEMA). Si el usuario.Timezone no está definido, intentará obtener la identificación de las propiedades user.country y java.home (sistema). Si no encuentra con éxito una ID de zona horaria, utiliza un valor GMT "alojamiento". En otras palabras, si no calcula su ID de zona horaria, usará GMT como su zona horaria predeterminada.
Tenga en cuenta que la propiedad del sistema se inicializa en el método initProperties de la clase java.lang.system. Este es un método local. Por lo tanto, el código fuente no está disponible, a menos que cave en la base del código local en el paquete de distribución J2SE para estudiar. Sin embargo, en los sistemas de Windows, el atributo del sistema se inicializa desde el registro de Windows, mientras que en Linux/Unix se inicializa por las variables de entorno. La Declaración de Javadoc del método InitProperties, ciertas propiedades "deben estar garantizadas para definirse" y enumerarlas. De las tres propiedades del sistema utilizadas por el método GetDefault de la clase Java.util.Timezone, solo Java.Home figura en Javadoc como una propiedad "garantizada".
Soluciones recomendadas:
Entonces, ¿cómo te aseguras de que Java te dé el momento y la fecha adecuados? La mejor manera es confirmar que la clase de zona horaria predeterminada de Java Virtual Machine (JVM) es correcta y es adecuada para su alcance geográfico (localidad). ¿Cómo se asegura de que la zona horaria predeterminada sea correcta y adecuada? Este es otro problema nuevo. Como la mayoría de los problemas trataron, esto tiene muchas soluciones. De acuerdo con el código fuente del método Java.util.Timezone.getDefault, la mejor manera es establecer correctamente la propiedad User.Timezone. Al iniciar la máquina virtual Java, puede anular fácilmente el valor establecido en el método java.lang.system.initproperties utilizando el parámetro de línea de comandos -d. Por ejemplo:
Java -Duser.Timezone = Asia/Shanghai DataTest
Este comando inicia la clase DataTest y establece la propiedad User.Timezone en Asia/Shanghai. También puede establecer la propiedad user.timezone utilizando el método setProperty de la clase java.lang.system:
System.SetProperty ("User.Timezone", "Asia/Shanghai");Si no hay una ID de zona horaria disponible para usted, puede crear una zona horaria personalizada utilizando el método SetDefault de la clase java.util.timezone para establecerlo en la hora predeterminada zone-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Recuerde que en J2SE, la mayoría de las clases de fecha y tiempo contienen información de la zona horaria, incluidas esas clases de formato, como java.text.dateformat, por lo que todas se ven afectadas por la zona horaria predeterminada del JVM. Sin embargo, cuando crea instancias de estas clases, puede garantizar la información correcta de la zona horaria para ellos, lo que le facilita establecer la zona horaria predeterminada de todo el JVM. Y una vez configurado, puede asegurarse de que todas estas clases usen la misma zona horaria predeterminada.