Analisei um java.util.Date
de um String
mas ele está definindo o fuso horário local como o fuso horário do date
objeto.
O fuso horário não está especificado no String
qual Date
é analisado. Eu quero definir um fuso horário específico do date
objeto.
Como eu posso fazer isso?
java
date
timezone
java.util.date
Yatendra Goel
fonte
fonte
Respostas:
Use DateFormat. Por exemplo,
fonte
TimeZone.setDefault()
antes de ligargetTime()
para que o novo objeto de data fique no fuso horário desejado. No JDK 1.8, asCalendar.getTime()
chamadasreturn new Date(getTimeInMillis());
.Esteja ciente de que os
java.util.Date
objetos não contêm nenhuma informação de fuso horário por si mesmos - você não pode definir o fuso horário em umDate
objeto. A única coisa que umDate
objeto contém é um número de milissegundos desde a "época" - 1 de janeiro de 1970, 00:00:00 UTC.Como mostra o ZZ Coder, você define o fuso horário no
DateFormat
objeto, para informar em que fuso horário deseja exibir a data e a hora.fonte
long
campo chamadofastTime
.Date.toString()
na verdade, usa aCalendar
para interpretar esse milissegundo. Portanto, imprimir umDate
faz parecer um fuso horário (padrão), levando a perguntas compreensíveis sobre como definir esse fuso horário.tl; dr
Sem fuso horário no juDate
Como as outras respostas corretas declararam, um java.util.Date não tem fuso horário † . Representa UTC / GMT (sem deslocamento de fuso horário). Muito confuso porque seu
toString
método aplica o fuso horário padrão da JVM ao gerar uma representação de String.Evite juDate
Por esse e muitos outros motivos, você deve evitar o uso de java.util.Date e .Calendar e java.text.SimpleDateFormat interno. Eles são notoriamente problemáticos.
Em vez disso, use o pacote java.time incluído no Java 8 .
java.time
As classes java.time podem representar um momento na linha do tempo de três maneiras:
Instant
)OffsetDateTime
comZoneOffset
)ZonedDateTime
comZoneId
)Instant
Em java.time , o componente básico é
Instant
um momento na linha do tempo no UTC. UseInstant
objetos para grande parte da sua lógica de negócios.OffsetDateTime
Aplique um deslocamento do UTC para ajustar o horário do relógio de parede de alguma localidade .
Aplique a
ZoneOffset
para obter umaOffsetDateTime
.ZonedDateTime
Melhor é aplicar um fuso horário , um deslocamento mais as regras para lidar com anomalias, como horário de verão (DST) .
Aplique a
ZoneId
aInstant
para obter aZonedDateTime
. Sempre especifique um nome de fuso horário adequado . Nunca use abreviações de 3 a 4 comoEST
ouIST
que não sejam únicas nem padronizadas.LocalDateTime
Se a sequência de entrada não possuir nenhum indicador de deslocamento ou zona, analise como a
LocalDateTime
.Se você tiver certeza do fuso horário pretendido, atribua a
ZoneId
para produzir aZonedDateTime
. Veja o exemplo de código acima na seção tl; dr na parte superior.Strings formatadas
Chame o
toString
método em qualquer uma dessas três classes para gerar uma String representando o valor de data e hora no formato padrão ISO 8601 . AZonedDateTime
classe estende o formato padrão acrescentando o nome do fuso horário entre colchetes.Para outros formatos, use a
DateTimeFormatter
classe Geralmente, é melhor deixar essa classe gerar formatos localizados usando a linguagem humana esperada do usuário e as normas culturais. Ou você pode especificar um formato específico.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
.O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .
Para saber mais, consulte o Tutorial do Oracle . E procure Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
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 strings, não há necessidade de
java.sql.*
classes.Onde obter as classes java.time?
O projeto ThreeTen-Extra estende o java.time com classes adicionais. Este projeto é um campo de prova para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como
Interval
,YearWeek
,YearQuarter
, e mais .Joda-Time
Enquanto o Joda-Time ainda é mantido ativamente, seus fabricantes nos disseram para migrar para o java.time o mais rápido possível. Deixo esta seção intacta como referência, mas sugiro usar a
java.time
seção acima.No Joda-Time , um objeto de data e hora (
DateTime
) realmente conhece seu fuso horário atribuído. Isso significa um deslocamento do UTC e as regras e o histórico do horário de verão (DST) do fuso horário e outras anomalias desse tipo.Chame o
toString
método para gerar uma String no formato ISO 8601 .O Joda-Time também oferece recursos avançados para gerar todos os tipos de outros formatos de String.
Se necessário, você pode converter de Joda-Time DateTime para um java.util.Date.
Pesquise StackOverflow por "joda date" para encontrar muitos mais exemplos, alguns bastante detalhados.
† Na verdade não é um fuso horário incorporado em um java.util.Date, utilizados para algumas funções internas (ver comentários sobre esta resposta). Mas esse fuso horário interno não é exposto como uma propriedade e não pode ser definido. Esse fuso horário interno não é o usado pelo
toString
método na geração de uma representação de sequência do valor de data e hora; em vez disso, o fuso horário padrão atual da JVM é aplicado imediatamente. Então, como abreviação, costumamos dizer "juDate não tem fuso horário". Confuso? Sim. Mais uma razão para evitar essas velhas classes cansadas.fonte
BaseCalendar.Date cdate
propriedade, se configurada. Dê uma olhada no código fonte aqui . Você não pode definir o fuso horário de um objeto juDate, exceto alterando o fuso horário padrão da JVM chamandoTimeZone.setDefault(TimeZone.getTimeZone("NEW_TIME_ZONE"));
. Assim, há um deslocamento de fuso horário e você pode obter o deslocamento chamando o método juDate.getTimezoneOffset deprecated ()toString
método que aplica o fuso horário padrão atual da JVM; novamente ignorando o fuso horário oculto. Portanto, por questões de brevidade, dizemos que java.util.Date não tem fuso horário. Como Art , é uma mentira que diz a verdade.TimeZone.setDefault
, você não está definindo o fuso horário do objeto java.util.Date - o objeto Date ainda ignora o fuso horário oculto , atuando efetivamente no UTC. Você afetaria otoString
método da data . Definir o padrão altera o fuso horário padrão da JVM, que geralmente é definido como o fuso horário do sistema operacional host. Essa chamada não é recomendada , pois afeta todo o código em todos os encadeamentos de todos os aplicativos em execução nessa JVM e o faz on-the-fly enquanto eles estão em execução. Por ser rude e perigoso, essa ligação deve ser considerada apenas como último recurso.equals
,hashcode
,getTime
..) Se você der uma olhada noequals
método, ele chamagetTime()
que as chamadasgetTimeImpl()
, que as chamadasnormalize()
se acdate
propriedade não é normalizada. Nonormalize()
método, a última condição if recalcula os milissegundos desde 1/1/70 com base em suas informações de fuso horário armazenadas se o fuso horário decdate
for diferente do fuso horário do ambiente atual da JVM em que está sendo executado. (Dê uma olhadasun.util.calendar.AbstractCalendar getCalendarDate(long millis, CalendarDate date)
)Você também pode definir o fuso horário no nível da JVM
resultado:
fonte
TimeZone.setDefault
é bastante drástica, pois afeta toda a JVM, afeta todos os outros objetos e encadeamentos. Veja esta resposta para obter detalhes, incluindo ainda mais complicações, se você estiver executando com um SecurityManager. Adicionando ainda mais complicação: Esse comportamento foi alterado em várias versões do Java, conforme discutido nesta pergunta .Se você precisar trabalhar apenas com classes JDK padrão, poderá usar isto:
O crédito vai para este post .
fonte
java.util.Calendar
é a maneira usual de lidar com fusos horários usando apenas classes JDK. O Apache Commons possui outras alternativas / utilitários que podem ser úteis. A nota de Edit Spong me lembrou que eu ouvi coisas realmente boas sobre Joda-Time (embora eu não as tenha usado).fonte
Period
,Duration
, eInterval
. Essas extensões incluem métodos de comparação, tais comocontains
,abuts
,overlap
, egap
. EPeriodFormatterBuilder
pode criar frases descritivas como "15 anos e 8 meses".Converta a Data em String e faça-o com SimpleDateFormat.
fonte
Se alguém precisar disso, se você precisar converter um
XMLGregorianCalendar
fuso horário para o seu fuso horário atual a partir do UTC, basta definir o fuso horário e0
, em seguida, ligartoGregorianCalendar()
- ele permanecerá no mesmo fuso horário, masDate
sabe como convertê-lo para seu, para que você possa obter os dados a partir daí.Resultado:
fonte
Este código foi útil em um aplicativo em que estou trabalhando:
fonte