1. Introdução ao fuso horário
O fuso horário representa o deslocamento do fuso horário e também pode calcular o tempo de economia do dia.
O fuso horário é frequentemente usado quando operar objetos que representam datas/horários, como data, calendário, etc.; Porque diferentes fusos horários têm momentos diferentes.
Vamos falar sobre duas maneiras comuns de criar objetos de fuso horário.
1. Obtenha o objeto de fuso horário padrão
Como usar:
Filho horário TZ = TimeZone.getDefault ()
2. Use o método getTimeZone (string ID) para obter objeto de fuso horário
Como usar:
// Obtenha o fuso horário correspondente a "GMT+08: 00" "China horário = zone horário.GetTimeZone (" GMT+: 08: 00 "); // Obtenha o fuso horário correspondente a" China/Chongqing "Chongqing = TimeZone.GettimeZone (" Asia/Chongqing "; Para os valores de todos os parâmetros de ID suportados pelo getTimeZone (String ID), você pode encontrá -los das seguintes maneiras:
String [] IDS = TimeZone.GetAVALABLEIDS (); para (string id: ids) System.out.printf (id+",");
Resultado da saída:
Etc/gmt+12, etc/gmt+11, Pacífico/Midway, Pacific/niue ... etc.Por exemplo, crie o fuso horário correspondente ao segundo valor de impressão "etc/gmt+11" acima. O método é o seguinte:
Filho TimeFuso horário ():
Objeto clone () sincronizado String estática [] getAVALABLABLEIDS () String estática sincronizada [] getAvailableIds (int offsetMillis) int getdstsavings () sincronizado estático timezone getDefault () string final getDisplayName (Localale Localale) StringDisPlayName (boolEan diurno) getDisplayName () Final String getDisplayName (Boolean Daylighttime, Int Style) String getId () abstrata int getOffset (INT ERA, INT Ano, Int Mês, Int Day, Int DayOfWeek, Int TimeOfdayMillis) Int GetOffset (Longo Time) abstrata Intrawoffset () Synchronized STATILOZONONONONO GETEFTIDO (Longo Time) Resumo Intrawoffset () Syncronized STATIONZONONONONONEZONO GETTHONONE (Long Time) Resumo IDRAWOFFSET () Filho cronograma) Abstract Boolean IndaylightTime (Data Hora) Sincronizado estático void setDefault (Filho do tempo horário) void setId (String ID) Resumo void Setrawoffset (int OffsetMillis) Resumo Boolean UsoAylightTime ()
2. Exemplo de fuso horário:
A seguir, é apresentado um exemplo para demonstrar o uso do fuso horário na data.
O código de referência é o seguinte (timezonetest.java):
importar java.text.dateFormat; importar java.util.date; importar java.util.TimeZone;/*** Programa de teste do fuso horário*/public classe timeZoneTest {public static void main (string [] args) {// teste 3 métodos para criar a fuso horária ShowUSageUSageZones (); // Teste outras APIs de fuso horário testherapis (); // imprime todos os IDs suportados pelo getTimeZone (string ID) // printallTimeZones (); } / *** Teste 3 Métodos para criar objetos de fuso horário* / public static void showUSageOftimeZones () {Time Fuzone TZ; // (01) fuso horário padrão tz = timezone.getDefault (); printDatein (TZ); // (02) Defina o fuso horário "GMT+08: 00" TZ = TimeZone.GetTimeZone ("GMT+08: 00"); printDatein (TZ); // (03) Defina o fuso horário "" tz = timezone.getTimeZone ("Ásia/Chongqing"); printDatein (TZ); }/*** Imprima a data/hora correspondente a tz*/private estático void printDatein (fuso horário TZ) {// Data é 2013-09-19 14:22:30 Data = New Date (113, 8, 19, 14, 22, 30); // Obtenha a data de data padrão para formatar data de dataFormat df = dateFormat.getInstance (); // Defina o fuso horário como tz df.setTimeZone (TZ); // Obtenha a sequência formatada String str = df.format (data); System.out.println (tz.getId ()+":"+str); } / ** * OUTRAS APIs do Fuzo do Teste * / public static void testOterapis () {// Filho horário padrão TZ = TimeZone.getDefault (); // Get "id" string id = tz.getId (); // Obtenha o nome da string "Nome da exibição" = tz.getDisplayName (); // Obtenha "deslocamento do tempo". O deslocamento em relação ao "meridiano primário" é MS. int offset = tz.getrawoffset (); // Obtenha a hora correspondente do "time offset" int gmt = deslocamento/(3600*1000); System.out.printf ("id =%s, nome =%s, deslocamento =%s (ms), gmt =%s/n", id, nome, deslocamento, gmt); } / ** * Imprima todos os IDs suportados pelo getTimeZone (string id) * / public static void printallTimeZones () {string [] ids = timezone.getAvailableIds (); for (string id: ids) {// int offset = timezone.getTimeZone (Avaids [i]). getrawoffset (); //System.out.println(I+ ""+Avaids [i]+""+deslocamento/(3600 * 1000)+"/t"); System.out.printf (id+","); } System.out.println (); }}
3. Sobre o fuso horário e a calibração do tempo
Java e Solaris são muito semelhantes quando se trata de informações sobre os fusos horários. Cada fuso horário possui um identificador de ID do fuso horário. No J2SE 1.3 e 1.4, este ID é uma string, que é uma lista desses IDs localizados no subdiretório JRE/LIB do instalador J2SE. O J2SE 1.3 contém apenas arquivos TZMAppings, mas o J2SE 1.4 contém arquivos de dados do fuso horário em diferentes regiões do mundo. JRE/lib/zi armazena esses arquivos. No J2SE 1.4, Sun.util.Calendar.ZoneInfo obtém regras DST desses arquivos. Em Solaris, esses arquivos de dados do fuso horário são armazenados em forma binária e não são arquivos de texto, para que você não possa vê -los. O arquivo de dados do fuso horário no J2SE 1.4 é diferente daquele em Solaris.
O código -fonte do método getDefault na classe java.util.TimeZone mostra que acabará chamando o método getTimeZone do Sun.util.calendar.zoneinfo Class. Este método retorna um parâmetro de string como ID para a área de tempo necessária. Esse ID de fuso horário padrão é obtido na propriedade User.TimeZone (System). Se o user.TimeZone não estiver definido, ele tentará obter o ID das propriedades User.Country e Java.Home (System). Se não encontrar um ID de fuso horário com sucesso, ele usa um valor GMT de "fallback". Em outras palavras, se não calcular seu ID do fuso horário, usará o GMT como seu fuso horário padrão.
Observe que a propriedade do sistema é inicializada no método initProperties da classe java.lang.system. Este é um método local. Portanto, o código-fonte não está disponível-a menos que você se aproxime da base de código local no pacote de distribuição J2SE para estudar. No entanto, nos sistemas Windows, o atributo do sistema é inicializado a partir do registro do Windows, enquanto no Linux/Unix é inicializado por variáveis de ambiente. A declaração Javadoc do método initProperties, certas propriedades "deve ser garantida como definida" e listá -las. Das três propriedades do sistema usadas pelo método getDefault da classe java.util.TimeZone, apenas Java.Home está listado em Javadoc como uma propriedade "garantida".
Soluções recomendadas:
Então, como você garante que o Java lhe dê a hora e a data certas? A melhor maneira é confirmar que a classe de fuso horário padrão de Java Virtual Machine (JVM) está correto e é adequado para o seu escopo geográfico (localidade). Como você garante que o fuso horário padrão esteja correto e adequado? Este é outro novo problema. Como a maioria dos problemas tratados, isso tem muitas soluções. De acordo com o código -fonte do método java.util.TimeZone.getDefault, a melhor maneira é definir corretamente a propriedade User.TimeZone. Ao iniciar a máquina virtual Java, você pode substituir facilmente o valor definido no método java.lang.system.initproperties usando o parâmetro -d de linha de comando. Por exemplo:
java -duser.TimeZone = Ásia/Shanghai DateTest
Este comando inicia a classe DateTest e define a propriedade User.TimeZone para Ásia/Xangai. Você também pode definir a propriedade User.TimeZone usando o método setProperty da classe java.lang.system:
System.SetProperty ("User.TimeZone", "Ásia/Shanghai");Se não houver ID de fuso horário disponível para você, você poderá criar um fuso horário personalizado usando o método setDefault da classe java.util.TimeZone para defini -lo como o tempo padrão zone-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Lembre-se de que, no J2SE, a maioria das classes relacionadas a data e no tempo contém informações sobre o fuso horário, incluindo essas classes de formato, como java.text.dateFormat, para que todas sejam afetadas pelo fuso horário padrão da JVM. No entanto, quando você cria instâncias dessas classes, você pode garantir as informações corretas do fuso horário para elas, facilitando a definição do fuso horário padrão de toda a JVM. E uma vez configurado, você pode garantir que todas essas classes usem o mesmo fuso horário padrão.