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 #.

mrblah
la source
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. :)

delfuego
la source
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();
cdmckay
la source
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();
Basil Bourque
la source
J'ai également posté une autre réponse avec plus de détails sur une question en double.
Basil Bourque
16

Je préfère utiliser l'objet Calendrier.

Calendar now = GregorianCalendar.getInstance()

Je trouve que c'est beaucoup plus facile de travailler avec. Vous pouvez également obtenir un objet Date à partir du calendrier.

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

Ralph
la source
4
Ou cela peut être tout simplementCalendar.getInstance()
tirage
14

En Java 8, c'est:

ZonedDateTime dateTime = ZonedDateTime.now();
Vitalii Fedorenko
la source
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 .

Chandra Patni
la source
10

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

user243773
la source
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();
gordy
la source
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();
parkerfath
la source
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.

akhil_mittal
la source