Como obter a data e hora atuais

342

Como obtenho a data e hora atuais em Java?

Eu estou procurando algo que é equivalente ao DateTime.Nowdo c #.

mrblah
fonte
Esta pergunta é mais antiga que essa pergunta anteriormente marcada como duplicada. Inverti a designação, reabrindo esta questão e marcando a mais recente como duplicada.
Basil Bourque

Respostas:

414

Apenas construa um novo Dateobjeto sem argumentos; isso atribuirá a data e hora atuais ao novo objeto.

import java.util.Date;

Date d = new Date();

Nas palavras dos Javadocs para o construtor de argumento zero :

Aloca um objeto Date e o inicializa para que ele represente a hora em que foi alocado , medida no milissegundo mais próximo.

Verifique se você está usando java.util.Datee não java.sql.Date- o último não possui um construtor de zero-arg e possui semânticas um pouco diferentes que são o tópico de uma conversa totalmente diferente. :)

delfuego
fonte
13
Observe também que GregorianCalendar e muitos objetos semelhantes funcionam da mesma maneira. Portanto, qualquer que seja o tipo de objeto de data / calendário com o qual você esteja trabalhando, o construtor de argumento zero geralmente inicializa o objeto na data / hora atual.
Peter Di Cecco
No documento Date: A partir do JDK 1.1, a classe Calendar deve ser usada para converter campos de datas e horas, e a classe DateFormat deve ser usada para formatar e analisar as seqüências de datas.
Paolo M
9
Por favor, considere as novas APIs Java8 - LocalDateTime.now () e ZonedDateTime.now ()
Oleg Mikheev
59

As classes Java Date e Calendar são consideradas por muitos como mal projetadas. Você deve dar uma olhada no Joda Time , uma biblioteca comumente usada no lugar das bibliotecas de datas internas do Java.

O equivalente DateTime.Nowem Joda Time é:

DateTime dt = new DateTime();

Atualizar

Conforme observado nos comentários, as versões mais recentes do Joda Time têm um DateTime.now()método, portanto:

DateTime dt = DateTime.now();
cdmckay
fonte
4
A versão atual (2.1) do Joda parece ter um método estático DateTime.now () (opcionalmente aceita DateTimeZone ou Chronology). joda-time.sourceforge.net/apidocs/org/joda/time/…
Roman A. Taycher
11
Observe que esta resposta foi publicada em 2010. O Java 8 absorveu muitos dos melhores recursos do Joda Time. Consulte a documentação oficial e muitos outros artigos on-line para obter mais informações.
21416 DavidSão Paulo
36

tl; dr

Instant.now()

java.time

A classe java.util.Date foi ultrapassada pelo novo pacote java.time ( Tutorial ) no Java 8 e posterior. As antigas classes java.util.Date/.Calendar são notoriamente problemáticas, confusas e com falhas. Evite-os.

ZonedDateTime

Obtenha o momento atual em java.time.

ZonedDateTime now = ZonedDateTime.now();

A ZonedDateTimeencapsula:

  • Encontro.
  • Hora do dia, com uma fração de segundo a resolução de nanossegundos .
  • Fuso horário.

Se nenhum fuso horário for especificado, o fuso horário padrão atual da sua JVM será designado silenciosamente. É melhor especificar o fuso horário desejado / esperado do que confiar implicitamente no padrão.

ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z );

UTC

Geralmente é melhor adquirir o hábito de realizar seu trabalho de back-end (lógica de negócios, banco de dados, armazenamento, troca de dados), tudo no fuso horário UTC . O código acima depende implicitamente do fuso horário padrão atual da JVM.

A Instantclasse representa um momento na linha do tempo no UTC com uma resolução de nanossegundos.

Instant instant = Instant.now();

A Instantclasse é uma classe básica de bloco de construção em java.time e pode ser usada frequentemente em seu código.

Quando você precisar de mais flexibilidade na formatação, transforme-a em OffsetDateTime. Especifique um ZoneOffsetobjeto. Para o UTC, use a constante útil para o UTC .

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

Fuso horário

Você se ajusta facilmente a outro fuso horário para apresentação ao usuário. Use um nome de fuso horário adequado , nunca os códigos de 3-4 letras como ESTou IST.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime nowMontreal = instant.atZone( z );

Gere uma representação String desse valor de data e hora, localizado.

String output = DateTimeFormatter
    .ofLocalizedDate( FormatStyle.FULL )
    .withLocale( Locale.CANADA_FRENCH )
    .format ( nowMontreal );

Instant

Ou, para permanecer no UTC, use Instant. Um Instantobjeto representa um momento na linha do tempo, com resolução de nanossegundos, sempre em UTC. Isso fornece o bloco de construção para uma data e hora da zona, juntamente com uma atribuição de fuso horário. Você pode pensar conceitualmente desta maneira:

ZonedDateTime= Instant+ZoneId

Você pode extrair um Instantde a ZonedDateTime.

Instant instantNow = zdt.toInstant();

Você pode começar com um instante. Não há necessidade de especificar um fuso horário aqui, como Instantsempre no UTC.

Instant now = Instant.now();
Basil Bourque
fonte
Também postei outra resposta com mais detalhes em uma pergunta duplicada.
Basil Bourque
16

Eu prefiro usar o objeto Calendário.

Calendar now = GregorianCalendar.getInstance()

Acho muito mais fácil trabalhar com isso. Você também pode obter um objeto Date no calendário.

http://java.sun.com/javase/6/docs/api/java/util/GregorianCalendar.html

Ralph
fonte
4
Ou pode ser simplesmenteCalendar.getInstance()
desenhe
14

No Java 8 é:

ZonedDateTime dateTime = ZonedDateTime.now();
Vitalii Fedorenko
fonte
12
import java.util.Date;   
Date now = new Date();

Observe que o objeto Date é mutável e, se você quiser fazer algo sofisticado, use jodatime .

Chandra Patni
fonte
10

java.lang.System.currentTimeMillis(); retornará a data e hora desde a época

user243773
fonte
Bom para o registo, mas requer análise e conversão para exibir para o usuário
Rishi Dua
6
import org.joda.time.DateTime;

DateTime now = DateTime.now();
gordy
fonte
5

Se você criar um novo objeto Data, por padrão, ele será definido para o horário atual:

import java.util.Date;
Date now = new Date();
parkerfath
fonte
3

O Java sempre teve suporte inadequado para os casos de uso de data e hora. Por exemplo, as classes existentes (como java.util.Datee SimpleDateFormatter) não são seguras para threads, o que pode levar a problemas de simultaneidade. Também há certas falhas na API. Por exemplo, os anos java.util.Dateiniciam em 1900, os meses iniciam em 1 e os dias iniciam em 0 - não muito intuitivo. Esses problemas levaram à popularidade de bibliotecas de data e hora de terceiros, como Joda-Time. Para endereçar uma nova data e hora, a API foi projetada para Java SE 8.

LocalDateTime timePoint = LocalDateTime.now();
System.out.println(timePoint);

Conforme o documento :

O método now()retorna a data atual usando o relógio do sistema e o fuso horário padrão, e não nulo . Ele obtém a data e hora atual do relógio do sistema no fuso horário padrão. Isso consultará o relógio do sistema no fuso horário padrão para obter a data e hora atuais. O uso desse método impedirá a capacidade de usar um relógio alternativo para teste porque o relógio é codificado.

akhil_mittal
fonte