Come ottenere la data e l'ora correnti


342

Come posso ottenere la data e l'ora correnti in Java?

Sto cercando qualcosa che è equivalente a DateTime.Nowda C #.


Questa domanda è più vecchia di questa domanda precedentemente contrassegnata come duplicata. Così ho invertito la designazione, riaprendo questa domanda e contrassegnando quella più recente come duplicata.
Basil Bourque,

Risposte:


414

Basta costruire un nuovo Dateoggetto senza alcun argomento; questo assegnerà la data e l'ora correnti al nuovo oggetto.

import java.util.Date;

Date d = new Date();

Nelle parole di Javadocs per il costruttore a argomento zero :

Alloca un oggetto Date e lo inizializza in modo che rappresenti l'ora in cui è stato allocato , misurato al millisecondo più vicino.

Assicurati di usare java.util.Datee non java.sql.Date- quest'ultimo non ha un costruttore zero-arg e ha una semantica leggermente diversa che è l'argomento di una conversazione completamente diversa. :)


13
Si noti inoltre che GregorianCalendar e molti oggetti simili funzionano allo stesso modo. Quindi, qualunque sia il tipo di oggetto data / calendario con cui stai lavorando, il costruttore a argomento zero di solito inizializza l'oggetto alla data / ora corrente.
Peter Di Cecco,

Dal documento Date: a partire da JDK 1.1, la classe Calendar dovrebbe essere utilizzata per convertire tra campi data e ora e la classe DateFormat dovrebbe essere utilizzata per formattare e analizzare le stringhe di date.
Paolo M,

9
Si prega di considerare le nuove API Java8 - LocalDateTime.now () e ZonedDateTime.now ()
Oleg Mikheev,

59

Le classi Java Date e Calendar sono considerate da molti mal progettate. Dovresti dare un'occhiata a Joda Time , una libreria comunemente usata al posto delle librerie di date integrate di Java.

L'equivalente di DateTime.Nowin Joda Time è:

DateTime dt = new DateTime();

Aggiornare

Come notato nei commenti, le ultime versioni di Joda Time hanno un DateTime.now()metodo, quindi:

DateTime dt = DateTime.now();

4
La versione corrente (2.1) di Joda sembra avere un metodo DateTime.now statico () (facoltativamente accetta DateTimeZone o Chronology). joda-time.sourceforge.net/apidocs/org/joda/time/…
Roman A. Taycher

1
Nota che questa risposta è stata pubblicata nel 2010. Java 8 ha assorbito molte delle migliori funzionalità di Joda Time. Vedere la documentazione ufficiale e molti altri articoli online per ulteriori informazioni.
DavidS,

36

tl; dr

Instant.now()

java.time

La classe java.util.Date è stata superata dal nuovo pacchetto java.time ( Tutorial ) in Java 8 e versioni successive. Le vecchie classi java.util.Date/.Calendar sono notoriamente problematiche, confuse e imperfette. Evitali.

ZonedDateTime

Ottieni il momento attuale in java.time.

ZonedDateTime now = ZonedDateTime.now();

A ZonedDateTimeincapsula:

  • Data.
  • Ora del giorno, con una frazione di secondo in risoluzione di nanosecondi .
  • Fuso orario.

Se non viene specificato alcun fuso orario, l'attuale fuso orario predefinito di JVM viene assegnato in modo silenzioso. Meglio specificare il fuso orario desiderato / previsto piuttosto che fare affidamento implicitamente sul valore predefinito.

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

UTC

In genere è meglio prendere l'abitudine di svolgere il proprio lavoro di back-end (logica aziendale, database, archiviazione, scambio di dati) tutto nel fuso orario UTC . Il codice sopra si basa implicitamente sul fuso orario predefinito corrente della JVM.

La Instantclasse rappresenta un momento nella sequenza temporale in UTC con una risoluzione di nanosecondi.

Instant instant = Instant.now();

La Instantclasse è una classe di base in java.time e può essere usata spesso nel tuo codice.

Quando hai bisogno di maggiore flessibilità nella formattazione, trasformalo in un OffsetDateTime. Specificare un ZoneOffsetoggetto Per UTC utilizzare la costante utile per UTC .

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

Fuso orario

È possibile adattarsi facilmente a un altro fuso orario per la presentazione all'utente. Utilizzare un nome di fuso orario corretto , mai i codici di 3-4 lettere come ESTo IST.

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

Genera una rappresentazione String di quel valore data-ora, localizzata.

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

Instant

Oppure, per rimanere in UTC, utilizzare Instant. Un Instantoggetto rappresenta un momento sulla linea temporale, alla risoluzione di nanosecondi, sempre in UTC. Ciò fornisce il blocco predefinito per una data-ora suddivisa in zone, insieme a un'assegnazione di fuso orario. Puoi pensarlo concettualmente in questo modo:

ZonedDateTime= Instant+ZoneId

Puoi estrarre un Instantda a ZonedDateTime.

Instant instantNow = zdt.toInstant();

Puoi iniziare con un istante. Non è necessario specificare un fuso orario qui, come Instantsempre in UTC.

Instant now = Instant.now();

Ho anche pubblicato un'altra risposta con maggiori dettagli su una domanda duplicata.
Basil Bourque,



12
import java.util.Date;   
Date now = new Date();

Nota che l' oggetto Date è mutevole e se vuoi fare qualcosa di sofisticato, usa jodatime .


10

java.lang.System.currentTimeMillis(); restituirà il datetime dall'epoca


Buono per la registrazione ma richiede l'analisi e la conversione per la visualizzazione all'utente
Rishi Dua

6
import org.joda.time.DateTime;

DateTime now = DateTime.now();

5

Se si crea un nuovo oggetto Date, per impostazione predefinita verrà impostato l'ora corrente:

import java.util.Date;
Date now = new Date();

3

Java ha sempre ricevuto un supporto inadeguato per i casi d'uso di data e ora. Ad esempio, le classi esistenti (come java.util.Datee SimpleDateFormatter) non sono thread-safe e possono causare problemi di concorrenza. Inoltre ci sono alcuni difetti nell'API. Ad esempio, gli anni a java.util.Datepartire dal 1900, i mesi iniziano a 1 e i giorni iniziano a 0, non molto intuitivi. Questi problemi hanno portato alla popolarità di librerie di data e ora di terze parti, come ad esempio Joda-Time. Per indirizzare una nuova data e ora, l'API è progettata per Java SE 8.

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

Come da documento :

Il metodo now()restituisce la data-ora corrente utilizzando l'orologio di sistema e il fuso orario predefinito, non null . Ottiene la data e l'ora correnti dall'orologio di sistema nel fuso orario predefinito. Ciò interrogherà l'orologio di sistema nel fuso orario predefinito per ottenere la data-ora corrente. L'uso di questo metodo impedirà la possibilità di utilizzare un orologio alternativo per i test poiché l'orologio è codificato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.