tl; dr
Instant.now() // Capture the current moment in UTC.
Gere uma String para representar esse valor:
Instant.now().toString()
2016-09-13T23: 30: 52.123Z
Detalhes
Como a resposta correta de Jon Skeet afirmou, um objeto java.util.Date não tem fuso horário † . Mas sua toString
implementação aplica o fuso horário padrão da JVM ao gerar a representação String desse valor de data e hora. Confuso para o programador ingênuo, uma Data parece ter um fuso horário, mas não possui.
Os java.util.Date
, j.u.Calendar
e java.text.SimpleDateFormat
aulas empacotados com Java são notoriamente problemático. Evite-os. Em vez disso, use uma destas bibliotecas de data e hora competentes:
java.time (Java 8)
O Java 8 traz um excelente novo pacote java.time. * Para substituir as antigas classes java.util.Date/Calendar.
Obter horário atual no UTC / GMT é uma linha simples…
Instant instant = Instant.now();
Essa Instant
classe é o bloco de construção básico em java.time, representando um momento na linha do tempo no UTC com uma resolução de nanossegundos .
No Java 8, o momento atual é capturado com resolução de até milissegundos. O Java 9 traz uma nova implementação de Clock
captura do momento atual até a capacidade total de nanossegundos dessa classe, dependendo da capacidade do hardware do relógio do computador host.
Seu toString
método gera uma representação String de seu valor usando um formato ISO 8601 específico . Esse formato gera zero, três, seis ou nove dígitos ( milissegundos , microssegundos ou nanossegundos ) conforme necessário para representar a fração de segundo.
Se você deseja formatação mais flexível ou outros recursos adicionais, aplique um deslocamento de UTC igual a zero, para que o próprio UTC ( ZoneOffset.UTC
constante ) obtenha a OffsetDateTime
.
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );
Despejar no console…
System.out.println( "now.toString(): " + now );
Quando correr ...
now.toString(): 2014-01-21T23:42:03.522Z
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
, e SimpleDateFormat
.
Para saber mais, consulte o Tutorial Oracle . E procure 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 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
ATUALIZAÇÃO: O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para o java.time classes .
Usando o tempo de Joda biblioteca gratuita de código aberto terceiros, você pode obter a data e hora atual em apenas uma linha de código.
O Joda-Time inspirou as novas classes java.time. * No Java 8, mas tem uma arquitetura diferente. Você pode usar o Joda-Time em versões mais antigas do Java. O Joda-Time continua trabalhando no Java 8 e continua sendo mantido ativamente (a partir de 2014). No entanto, a equipe Joda-Time aconselha a migração para java.time.
System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );
Código de exemplo mais detalhado (Joda-Time 2.3)…
org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time zone.
org.joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC );
Despejar no console…
System.out.println( "Local time in ISO 8601 format: " + now );
System.out.println( "Same moment in UTC (Zulu): " + zulu );
Quando correr ...
Local time in ISO 8601 format: 2014-01-21T15:34:29.933-08:00
Same moment in UTC (Zulu): 2014-01-21T23:34:29.933Z
Para obter mais exemplos de código executando trabalhos de fuso horário, consulte minha resposta para uma pergunta semelhante.
Fuso horário
Eu recomendo que você sempre especifique um fuso horário em vez de depender implicitamente do fuso horário padrão atual da JVM (que pode mudar a qualquer momento!). Essa confiança parece ser uma causa comum de confusão e bugs no trabalho de data e hora.
Ao chamar, now()
passe o fuso horário desejado / esperado a ser atribuído. Use a DateTimeZone
classe.
DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zoneMontréal );
Essa classe mantém uma constante para o fuso horário UTC .
DateTime now = DateTime.now( DateTimeZone.UTC );
Se você realmente deseja usar o fuso horário padrão atual da JVM, faça uma chamada explícita para que seu código seja auto-documentado.
DateTimeZone zoneDefault = DateTimeZone.getDefault();
ISO 8601
Leia sobre os formatos ISO 8601 . O java.time e o Joda-Time usam os formatos sensíveis desse padrão como padrão para analisar e gerar strings.
† Na verdade, java.util.Date faz ter um fuso horário, enterrada sob camadas de código-fonte. Para fins mais práticos, esse fuso horário é ignorado. Portanto, como abreviação, dizemos que java.util.Date não tem fuso horário. Além disso, esse fuso horário oculto não é o utilizado pelo toString
método de Date ; esse método usa o fuso horário padrão atual da JVM. Mais uma razão para evitar essa classe confusa e ficar com Joda-Time e java.time.