Question Comment obtenir la date / heure actuelle en Java


Quelle est la meilleure façon d'obtenir la date / heure actuelle en Java?


526
2018-03-03 01:48


origine


Réponses:


Cela dépend de la forme de date / heure que vous voulez:

  • Si vous voulez que la date / heure soit une seule valeur numérique, alors System.currentTimeMillis() vous donne cela, exprimé en millisecondes après l'époque UNIX (en Java). long). Cette valeur est un delta d'un point temporel UTC et est indépendante du fuseau horaire local ... en supposant que l'horloge système a été définie correctement.

  • Si vous souhaitez que la date et l'heure soient dans un formulaire vous permettant d'accéder numériquement aux composants (année, mois, etc.), vous pouvez utiliser l'une des options suivantes:

    • new Date() vous donne un Date objet initialisé avec la date / heure actuelle. Le problème est que le Date Les méthodes d'API sont pour la plupart défectueuses ... et déconseillées.

    • Calendar.getInstance() vous donne un Calendar objet initialisé avec la date / heure actuelle, en utilisant la valeur par défaut Locale et TimeZone. D'autres surcharges vous permettent d'utiliser un Locale et / ou TimeZone. Le calendrier fonctionne ... mais les API sont encore lourdes.

    • new org.joda.time.DateTime() vous donne un Joda-time objet initialisé avec la date / heure actuelle, en utilisant le fuseau horaire et la chronologie par défaut. Il y a beaucoup d'autres alternatives Joda ... trop de choses à décrire ici. (Mais notez que certaines personnes signalent que le temps de Joda a des problèmes de performance. LocalDateTime de Jodatime est lent lorsqu'il est utilisé la première fois.)

    • en Java 8, en appelant LocalDateTime.now() et ZonedDateTime.now() vous donnera des représentations1 pour la date / heure actuelle.

Avant Java 8, la plupart des gens qui connaissent ces choses ont recommandé Joda-time comme ayant (de loin) les meilleures API Java pour faire des choses en temps et en heure. Avec Java 8, ce n'est plus vrai. Cependant, si vous utilisez déjà l'heure Joda dans votre base de code, il n'y a pas de2 raison de migrer.


1 - Notez que LocalDateTime n'inclut pas de fuseau horaire. Comme le dit le javadoc: "Il ne peut pas représenter un instant sur la ligne de temps sans informations supplémentaires telles qu'un décalage ou un fuseau horaire."

2 - Votre code ne sera pas brisé si vous ne le faites pas, et vous ne recevrez pas d'avertissements de dépréciation. Bien sûr, le code Jase va probablement arrêter de recevoir des mises à jour, mais il est peu probable qu'il en ait besoin. Aucune mise à jour signifie la stabilité et c'est un bien chose.


526
2018-03-03 02:13



Si vous avez juste besoin de sortir un horodatage au format YYYY.MM.DD-HH.MM.SS (cas très fréquent) alors voici la façon de le faire:

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());

340
2017-08-05 09:08



Si vous voulez que la date actuelle soit Chaîne, essayez ceci:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
System.out.println(dateFormat.format(date));

ou

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime()));

http://www.mkyong.com/java/java-how-to-get-current-date-time-date-and-calender/


90
2017-10-07 06:04



Dans Java 8 c'est:

LocalDateTime.now()

et au cas où vous auriez besoin d'informations sur les fuseaux horaires:

ZonedDateTime.now()

et dans le cas où vous voulez imprimer une chaîne formatée fantaisie:

System.out.println(ZonedDateTime.now().format(DateTimeFormatter.RFC_1123_DATE_TIME))

53
2017-10-06 22:30



Il suffit de créer un objet Date ...

Date date = new Date();

40
2018-03-03 01:52



    // 2015/09/27 15:07:53
    System.out.println( new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(Calendar.getInstance().getTime()) );

    // 15:07:53
    System.out.println( new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime()) );

    // 09/28/2015
    System.out.println(new SimpleDateFormat("MM/dd/yyyy").format(Calendar.getInstance().getTime()));

    // 20150928_161823
    System.out.println( new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime()) );

    // Mon Sep 28 16:24:28 CEST 2015
    System.out.println( Calendar.getInstance().getTime() );

    // Mon Sep 28 16:24:51 CEST 2015
    System.out.println( new Date(System.currentTimeMillis()) );

    // Mon Sep 28
    System.out.println( new Date().toString().substring(0, 10) );

    // 2015-09-28
    System.out.println( new java.sql.Date(System.currentTimeMillis()) );

    // 14:32:26
    Date d = new Date();
    System.out.println( (d.getTime() / 1000 / 60 / 60) % 24 + ":" + (d.getTime() / 1000 / 60) % 60 + ":" + (d.getTime() / 1000) % 60 );

    // 2015-09-28 17:12:35.584
    System.out.println( new Timestamp(System.currentTimeMillis()) );

    // Java 8

    // 2015-09-28T16:16:23.308+02:00[Europe/Belgrade]
    System.out.println( ZonedDateTime.now() );

    // Mon, 28 Sep 2015 16:16:23 +0200
    System.out.println( ZonedDateTime.now().format(DateTimeFormatter.RFC_1123_DATE_TIME) );

    // 2015-09-28
    System.out.println( LocalDate.now(ZoneId.of("Europe/Paris")) ); // rest zones id in ZoneId class

    // 16
    System.out.println( LocalTime.now().getHour() );

    // 2015-09-28T16:16:23.315
    System.out.println( LocalDateTime.now() );

33
2017-11-06 09:38



Utilisation:

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
System.out.println(timeStamp );

(Ça marche.)


18
2018-03-18 10:44



tl; dr

Instant.now()                                         // Capture the current moment in UTC, with a resolution of nanoseconds.

… ou …

ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )  // Capture the current moment as seen in the wall-clock time used by the people of a particular region (a time zone).

java.time

Quelques-unes des réponses mentionnent que java.time Les classes sont le remplacement moderne des anciennes classes de date-heure problématiques regroupées avec les premières versions de Java. Voici un peu plus d'informations.

Fuseau horaire

Les autres réponses ne parviennent pas à expliquer comment un fuseau horaire est crucial pour déterminer la date et l'heure actuelles. Pour un moment donné, la date et le temps varie autour du globe par zone. Par exemple, quelques minutes après minuit est un nouveau jour Paris, France tout en étant "hier" dans Montreal, Quebec.

Instant

Une grande partie de votre logique métier et de votre stockage / échange de données doit être effectuée UTC, comme une meilleure pratique. Pour obtenir le moment actuel dans UTC avec une résolution dans nanosecondes, utilisation Instant classe.

Instant instant = Instant.now();

ZonedDateTime

Vous pouvez ajuster cela Instant dans d'autres fuseaux horaires. Appliquer un ZoneId objet pour obtenir un ZonedDateTime.

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

Nous pouvons sauter le Instant et obtenez le courant ZonedDateTime directement.

ZonedDateTime zdt = ZonedDateTime.now( z );

Passez toujours cet argument facultatif de fuseau horaire. S'il est omis, le fuseau horaire par défaut actuel de votre JVM est appliqué. La valeur par défaut peut changer à tout moment, même pendant runtime. Ne soumettez pas votre application à une externalité hors de votre contrôle. Toujours spécifier le fuseau horaire souhaité / attendu.

ZonedDateTime do_Not_Do_This = ZonedDateTime.now(); // BAD - Never rely implicitly on the current default time zone.

Vous pouvez ensuite extraire un Instant du ZonedDateTime.

Instant instant = zdt.toInstant();

Toujours utiliser un Instant ou ZonedDateTime Plutôt qu'un LocalDateTime quand vous voulez un moment réel sur la ligne de temps. le Local… types volontairement n'ont pas de concept de fuseau horaire, de sorte qu'ils représentent seulement une idée approximative d'un moment possible. Pour obtenir un moment réel, vous devez affecter un fuseau horaire pour transformer le Local… types dans un ZonedDateTime et ainsi le rendre significatif.

LocalDate

le LocalDate class représente une valeur de date uniquement sans heure et sans fuseau horaire.

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );  // Always pass a time zone.

Cordes

Pour générer une chaîne représentant la valeur date-heure, appelez simplement toString sur les classes java.time pour la norme ISO 8601 formats.

String output = myLocalDate.toString();  // 2016-09-23

… ou …

String output = zdt.toString();  // 2016-09-23T12:34:56.789+03:00[America/Montreal]

le ZonedDateTime class étend le format standard en ajoutant judicieusement le nom du fuseau horaire entre crochets.

Pour les autres formats, recherchez Stack Overflow pour de nombreuses questions et réponses sur le DateTimeFormatter classe.

Éviter LocalDateTime

Contrairement au commentaire sur la Question de RamanSB, vous devriez ne pas utilisation LocalDateTime classe pour la date-heure actuelle.

le LocalDateTime il manque délibérément un fuseau horaire ou des informations de décalage de UTC. Alors ceci est ne pas approprié lorsque vous suivez un moment spécifique sur la ligne de temps. Certainement ne pas approprié pour capturer le moment actuel.

Le libellé "Local" est contre-intuitif. Ça veut dire tout localité plutôt que d'une localité spécifique. Par exemple, Noël cette année commence à minuit le 25 décembre: 2017-12-25T00:00:00, être représenté en tant que LocalDateTime. Mais cela signifie minuit à différents endroits du globe à des moments différents. Minuit arrive en premier KiribatiPlus tard, en Nouvelle-Zélande, des heures plus tard en Inde, et ainsi de suite, plusieurs heures passent avant que Noël ne commence en France, alors que les enfants canadiens attendent toujours ce jour. Chacun de ces points de départ de Noël serait représenté séparément ZonedDateTime.


De l'extérieur de votre système

Si vous ne pouvez pas faire confiance à votre horloge système, voir Java: Obtenir la date et l'heure actuelles du serveur et non de l'horloge système et ma réponse.

photo of a couple of external radio clock devices

java.time.Clock

Pour exploiter un fournisseur alternatif du moment actuel, écrivez une sous-classe du résumé java.time.Clock classe.

Vous pouvez passer votre Clock mise en œuvre en tant qu'argument aux différents java.time méthodes Par exemple, Instant.now( clock ).

Instant instant = Instant.now( yourClockGoesHere ) ;

À des fins de test, notez les implémentations alternatives de Clock disponible statiquement de Clock lui-même: fixed, offset, tick, et plus.


Sur java.time

le java.time framework est construit dans Java 8 et plus tard. Ces classes supplantent le vieux problème héritage classes de date-heure telles que java.util.Date, Calendar, & SimpleDateFormat.

le Joda-Time projet, maintenant dans Mode de Maintenance, conseille la migration vers java.time Des classes.

Pour en savoir plus, voir Tutoriel Oracle. Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310.

Vous pouvez échanger java.time objets directement avec votre base de données. Utiliser un Pilote JDBC conforme à JDBC 4.2 ou plus tard. Pas besoin de cordes, pas besoin de java.sql.* Des classes.

Où obtenir les classes java.time?

  • Java SE 8, Java SE 9, et ensuite
    • Intégré
    • Partie de l'API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et Java SE 7
    • La plupart des fonctionnalités de java.time sont portées vers Java 6 & 7 ThreeTen-Backport.
  • Android
    • Versions ultérieures des implémentations de bundle Android des classes java.time.
    • Pour Android plus tôt, le ThreeTenABP le projet s'adapte ThreeTen-Backport (mentionné ci-dessus). Voir Comment utiliser ThreeTenABP ....

le ThreeTen-Extra Le projet étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts futurs à java.time. Vous pouvez trouver quelques classes utiles ici telles que Interval, YearWeek, YearQuarter, et plus.


17
2017-09-07 21:40



Il existe de nombreuses méthodes différentes:


14
2018-03-03 01:52