Comment obtenir la date et l'heure actuelles


342

Comment obtenir la date et l'heure actuelles en Java?

Je cherche quelque chose qui est équivalent à DateTime.NowC #.


Cette question est plus ancienne que cette question anciennement marquée comme doublon. J'ai donc inversé la désignation, en rouvrant cette question et en marquant la nouvelle comme étant la copie.
Basil Bourque

Réponses:


414

Construisez simplement un nouvel Dateobjet sans aucun argument; cela affectera la date et l'heure actuelles au nouvel objet.

import java.util.Date;

Date d = new Date();

Dans les mots des Javadocs pour le constructeur à zéro argument :

Alloue un objet Date et l' initialise pour qu'il représente l'heure à laquelle il a été alloué , mesurée à la milliseconde près.

Assurez-vous que vous utilisez java.util.Dateet non java.sql.Date- ce dernier n'a pas de constructeur à zéro argument et a une sémantique quelque peu différente qui fait l'objet d'une conversation entièrement différente. :)


13
Notez également que GregorianCalendar et de nombreux objets similaires fonctionnent de la même manière. Donc, quel que soit le type d'objet date / calendrier avec lequel vous travaillez, le constructeur zéro argument initialise généralement l'objet à la date / heure actuelle.
Peter Di Cecco

From Date doc: à partir de JDK 1.1, la classe Calendar doit être utilisée pour convertir entre les dates et les champs d'heure et la classe DateFormat doit être utilisée pour formater et analyser les chaînes de date.
Paolo M

9
Veuillez considérer les nouvelles API Java8 - LocalDateTime.now () et ZonedDateTime.now ()
Oleg Mikheev

59

Les classes Java Date et Calendar sont considérées par beaucoup comme mal conçues. Vous devriez jeter un œil à Joda Time , une bibliothèque couramment utilisée à la place des bibliothèques de dates intégrées de Java.

L'équivalent de DateTime.NowJoda Time est:

DateTime dt = new DateTime();

Mettre à jour

Comme indiqué dans les commentaires, les dernières versions de Joda Time ont une DateTime.now()méthode, donc:

DateTime dt = DateTime.now();

4
La version actuelle (2.1) de Joda semble avoir une méthode DateTime.now statique () (accepte éventuellement DateTimeZone ou Chronology). joda-time.sourceforge.net/apidocs/org/joda/time/…
Roman A. Taycher

1
Notez que cette réponse a été publiée en 2010. Java 8 a absorbé bon nombre des meilleures fonctionnalités de Joda Time. Consultez la documentation officielle et de nombreux autres articles en ligne pour plus d'informations.
DavidS

36

tl; dr

Instant.now()

java.time

La classe java.util.Date a été dépassée par le nouveau package java.time ( Tutorial ) dans Java 8 et versions ultérieures. Les anciennes classes java.util.Date/.Calendar sont notoirement gênantes, déroutantes et imparfaites. Évite-les.

ZonedDateTime

Obtenez le moment actuel dans java.time.

ZonedDateTime now = ZonedDateTime.now();

A ZonedDateTimerésume:

  • Date.
  • Heure du jour, avec une résolution d'une fraction de seconde à une nanoseconde .
  • Fuseau horaire.

Si aucun fuseau horaire n'est spécifié, le fuseau horaire par défaut actuel de votre machine virtuelle Java est attribué en mode silencieux. Mieux vaut spécifier votre fuseau horaire souhaité / attendu que de s'appuyer implicitement sur la valeur par défaut.

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

UTC

Il est généralement préférable de prendre l'habitude de faire votre travail back-end (logique métier, base de données, stockage, échange de données) le tout dans le fuseau horaire UTC . Le code ci-dessus repose implicitement sur le fuseau horaire par défaut actuel de la JVM.

La Instantclasse représente un moment de la chronologie en UTC avec une résolution de nanosecondes.

Instant instant = Instant.now();

La Instantclasse est une classe de blocs de construction de base dans java.time et peut être utilisée souvent dans votre code.

Lorsque vous avez besoin de plus de flexibilité dans le formatage, transformez-le en un OffsetDateTime. Spécifiez un ZoneOffsetobjet. Pour UTC, utilisez la constante pratique pour UTC .

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

Fuseau horaire

Vous vous ajustez facilement à un autre fuseau horaire pour la présentation à l'utilisateur. Utilisez un nom de fuseau horaire correct , jamais les codes à 3 ESTou 4 lettres tels que ou IST.

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

Générez une représentation String de cette valeur date-heure, localisée.

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

Instant

Ou, pour rester en UTC, utilisez Instant. Un Instantobjet représente un instant sur la timeline, à une résolution en nanosecondes, toujours en UTC. Cela fournit le bloc de construction pour une date-heure zonée, ainsi qu'une affectation de fuseau horaire. Vous pouvez y penser conceptuellement de cette façon:

ZonedDateTime= Instant+ZoneId

Vous pouvez extraire un Instantd'un ZonedDateTime.

Instant instantNow = zdt.toInstant();

Vous pouvez commencer par un instantané. Pas besoin de spécifier ici un fuseau horaire, comme Instantc'est toujours le cas en UTC.

Instant now = Instant.now();

J'ai également posté une autre réponse avec plus de détails sur une question en double.
Basil Bourque



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

Notez que l' objet Date est modifiable et si vous voulez faire quelque chose de sophistiqué, utilisez jodatime .


10

java.lang.System.currentTimeMillis(); renverra le datetime depuis l'époque


Bon pour la journalisation mais nécessite une analyse et une conversion pour l'affichage à l'utilisateur
Rishi Dua

6
import org.joda.time.DateTime;

DateTime now = DateTime.now();

5

Si vous créez un nouvel objet Date, par défaut, il sera défini sur l'heure actuelle:

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

3

Java a toujours obtenu un support insuffisant pour les cas d'utilisation de la date et de l'heure. Par exemple, les classes existantes (telles que java.util.Dateet SimpleDateFormatter) ne sont pas thread-safe, ce qui peut entraîner des problèmes de concurrence. Il y a aussi certaines failles dans l'API. Par exemple, les années java.util.Datecommencent à 1900, les mois commencent à 1 et les jours commencent à 0, ce qui n'est pas très intuitif. Ces problèmes ont conduit à la popularité des bibliothèques de date et d'heure tierces, telles que Joda-Time. Pour répondre à une nouvelle date et heure, l'API est conçue pour Java SE 8.

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

Selon doc :

La méthode now()renvoie la date-heure actuelle en utilisant l'horloge système et le fuseau horaire par défaut, et non null . Il obtient la date-heure actuelle de l'horloge système dans le fuseau horaire par défaut. Cela interrogera l'horloge système dans le fuseau horaire par défaut pour obtenir la date-heure actuelle. L'utilisation de cette méthode empêchera la possibilité d'utiliser une autre horloge pour les tests car l'horloge est codée en dur.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.