Preciso forçar qualquer operação relacionada ao horário para GMT / UTC, independentemente do fuso horário definido na máquina. Alguma maneira conveniente de fazer isso no código?
Para esclarecer, estou usando o horário do servidor DB para todas as operações, mas sai formatado de acordo com o fuso horário local.
Obrigado!
Respostas:
O OP respondeu a esta pergunta para alterar o fuso horário padrão para uma única instância de uma JVM em execução, defina a
user.timezone
propriedade do sistema:Se você precisar definir fusos horários específicos ao recuperar objetos Date / Time / Timestamp de um banco de dados
ResultSet
, use a segunda forma dosgetXXX
métodos que leva umCalendar
objeto:Ou definindo a data em uma PreparedStatement:
Isso garantirá que o valor armazenado no banco de dados seja consistente quando a coluna do banco de dados não mantém as informações de fuso horário.
As classes
java.util.Date
ejava.sql.Date
armazenam a hora real (milissegundos) em UTC. Para formatar estes na saída para outro fuso horário, useSimpleDateFormat
. Você também pode associar um fuso horário ao valor usando um objeto Calendar:Referência Útil
https://docs.oracle.com/javase/9/troubleshoot/time-zone-settings-jre.htm#JSTGD377
https://confluence.atlassian.com/kb/setting-the-timezone-for-the-java-environment-841187402.html
fonte
Além disso, se você pode definir o fuso horário JVM desta forma
ou
-Duser.timezone=GMT
nos argumentos da JVM.fonte
System.setProperty("user.timezone" ...)
não funciona.Tive que definir o fuso horário da JVM para o Windows 2003 Server porque ele sempre retornava GMT para a nova data ();
-Duser.timezone=America/Los_Angeles
Ou seu fuso horário apropriado. Encontrar uma lista de fusos horários também provou ser um pouco desafiador ...
Aqui estão duas listas;
http://wrapper.tanukisoftware.com/doc/english/prop-timezone.html
http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzatz%2F51%2Fadmin%2Freftz.htm
fonte
Você pode alterar o fuso horário usando TimeZone.setDefault () :
fonte
para mim, basta rápido SimpleDateFormat,
em seguida, formate a data com um fuso horário diferente.
fonte
Gostaria de recuperar o tempo do banco de dados em uma forma bruta (timestamp longo ou data de java) e, em seguida, usar SimpleDateFormat para formatá-lo ou Calendar para manipulá-lo. Em ambos os casos, você deve definir o fuso horário dos objetos antes de usá-lo.
Veja
SimpleDateFormat.setTimeZone(..)
eCalendar.setTimeZone(..)
para detalhesfonte
tl; dr
Evite depender do sistema operacional host ou JVM para o fuso horário padrão
Eu recomendo que você escreva todo o seu código para declarar explicitamente o fuso horário desejado / esperado. Você não precisa depender do fuso horário padrão atual da JVM. E esteja ciente de que o fuso horário padrão atual da JVM pode mudar a qualquer momento durante o tempo de execução, com qualquer código em qualquer thread de qualquer chamada de aplicativo
TimeZone.setDefault
. Tal chamada afeta todos os aplicativos dentro dessa JVM imediatamente.java.time
Algumas das outras respostas estavam corretas, mas agora estão fora de moda. As terríveis classes de data e hora empacotadas com as primeiras versões do Java eram falhas, escritas por pessoas que não entendiam as complexidades e sutilezas do tratamento de data e hora.
As classes legadas de data e hora foram substituídas pelas classes java.time definidas no JSR 310.
Para representar um fuso horário, use
ZoneId
. Para representar um deslocamento do UTC, useZoneOffset
. Um deslocamento é apenas algumas horas-minutos-segundos à frente ou atrás do meridiano principal. Um fuso horário é muito mais. Um fuso horário é uma história das alterações passadas, presentes e futuras do deslocamento usado pelas pessoas de uma determinada região.Para um deslocamento de zero horas-minutos-segundos, use a constante
ZoneOffset.UTC
.Instant
Para capturar o momento atual em UTC, use um
Instant
. Esta classe representa um momento em UTC, sempre em UTC por definição.ZonedDateTime
Para ver esse mesmo momento através do relógio de parede usado pelas pessoas de uma determinada região, ajuste o fuso horário. Mesmo momento, mesmo ponto na linha do tempo, horário diferente do relógio de parede.
Base de dados
Você menciona um banco de dados.
Para recuperar um momento do banco de dados, sua coluna deve ser de um tipo de dados semelhante ao padrão SQL
TIMESTAMP WITH TIME ZONE
. Recupere um objeto em vez de uma string. No JDBC 4.2 e posterior, podemos trocar objetos java.time com o banco de dados. OOffsetDateTime
é exigido pelo JDBC, enquantoInstant
&ZonedDateTime
são opcionais.Na maioria dos bancos de dados e drivers, acho que você obterá o momento conforme visto no UTC. Mas se não, você pode ajustar de duas maneiras:
Instant
:odt.toInstant()
Sobre java.time
A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como
java.util.Date
,Calendar
, eSimpleDateFormat
.Para saber mais, consulte o tutorial Oracle . E pesquise no Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .
Você pode trocar objetos java.time diretamente com seu banco de dados. Use um driver JDBC compatível com JDBC 4.2 ou posterior. Não há necessidade de cordas, não há necessidade de
java.sql.*
classes.Onde obter as classes java.time?
fonte
crie um par cliente / servidor, para que após a execução, cliente servidor envie a hora e data corretas. Então, o cliente pergunta ao servidor pm GMT e o servidor envia de volta a resposta certa.
fonte
Use a propriedade do sistema:
fonte
Execute esta linha no MySQL para redefinir seu fuso horário:
fonte
Uau. Eu sei que este é um segmento antigo, mas tudo que posso dizer é não chame TimeZone.setDefault () em nenhum código de nível de usuário. Isso sempre define o fuso horário para toda a JVM e quase sempre é uma péssima ideia. Aprenda a usar a biblioteca joda.time ou a nova classe DateTime em Java 8, que é muito semelhante à biblioteca joda.time.
fonte
Se você gostaria de obter a hora GMT apenas com intiger: var currentTime = new Date (); var currentYear = '2010' var currentMonth = 10; var currentDay = '30 'var currentHours = '20' var currentMinutes = '20 'var currentSeconds = '00' var currentMilliseconds = '00 '
fonte