Comment obtenir l'année, le mois, le jour, les heures, les minutes, les secondes et les millisecondes du moment actuel en Java?

104

Comment puis-je obtenir l'année, le mois, le jour, les heures, les minutes, les secondes et les millisecondes du moment actuel en Java? J'aimerais les avoir comme Strings.

romain
la source

Réponses:

254

Vous pouvez utiliser les getters de java.time.LocalDateTimepour cela.

LocalDateTime now = LocalDateTime.now();
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
int millis = now.get(ChronoField.MILLI_OF_SECOND); // Note: no direct getter available.

System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);

Ou, lorsque vous n'êtes pas encore sur Java 8, utilisez java.util.Calendar.

Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH) + 1; // Note: zero based!
int day = now.get(Calendar.DAY_OF_MONTH);
int hour = now.get(Calendar.HOUR_OF_DAY);
int minute = now.get(Calendar.MINUTE);
int second = now.get(Calendar.SECOND);
int millis = now.get(Calendar.MILLISECOND);

System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);

Quoi qu'il en soit, cela s'imprime à partir de maintenant:

16/04/2010 15: 15: 17.816

Pour convertir un inten String, utilisez String#valueOf().


Si votre intention est après tout de les organiser et de les afficher dans un format de chaîne convivial, alors mieux vaut utiliser soit Java8 java.time.format.DateTimeFormatter( tutoriel ici ),

LocalDateTime now = LocalDateTime.now();
String format1 = now.format(DateTimeFormatter.ISO_DATE_TIME);
String format2 = now.atZone(ZoneId.of("GMT")).format(DateTimeFormatter.RFC_1123_DATE_TIME);
String format3 = now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss", Locale.ENGLISH));

System.out.println(format1);
System.out.println(format2);
System.out.println(format3);

ou lorsque vous n'êtes pas encore sur Java 8, utilisez java.text.SimpleDateFormat:

Date now = new Date(); // java.util.Date, NOT java.sql.Date or java.sql.Timestamp!
String format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH).format(now);
String format2 = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH).format(now);
String format3 = new SimpleDateFormat("yyyyMMddHHmmss", Locale.ENGLISH).format(now);

System.out.println(format1);
System.out.println(format2);
System.out.println(format3);

Quoi qu'il en soit, cela donne:

2010-04-16T15: 15: 17.816
Ven, 16 avril 2010 15:15:17 GMT
20100416151517

Voir également:

BalusC
la source
Si vous comptez utiliser printf, vous pouvez tout aussi bien utiliser les formats Date / Heure au lieu d'utiliser l'étape intermédiaire, c'est-à-dire "% 1 $ tm% 1 $ te,% 1 $ tY", c (voir java.util. Formatter pour la syntaxe complète)
M. Jessup
1
@M. Jessup: C'est en effet plus agréable. Je ne l'ai cependant jamais utilisé, donc je ne pouvais pas le saisir par le haut de la tête, ce qui précède est juste à des fins de démonstration. Quoi qu'il en soit, je préférerais saisir SimpleDateFormatou DateTimeFormatterpour cette tâche particulière :)
BalusC
Je suggérerais fortement d'utiliser joda-time, car son API beaucoup plus agréable et compréhensible par rapport aux dates et calendriers mal conçus que Java propose directement.
Kaitsu
Je préfère celui-ci, en particulier dans i18n work pour obtenir startTime ou endTime:new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
Eddy
1
Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 et 7 dans le projet ThreeTen-Backport .
Basil Bourque
30

Passez à joda-time et vous pouvez le faire en trois lignes

DateTime jodaTime = new DateTime();

DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS");
System.out.println("jodaTime = " + formatter.print(jodaTime));

Vous avez également un accès direct aux champs individuels de la date sans utiliser de calendrier.

System.out.println("year = " + jodaTime.getYear());
System.out.println("month = " + jodaTime.getMonthOfYear());
System.out.println("day = " + jodaTime.getDayOfMonth());
System.out.println("hour = " + jodaTime.getHourOfDay());
System.out.println("minute = " + jodaTime.getMinuteOfHour());
System.out.println("second = " + jodaTime.getSecondOfMinute());
System.out.println("millis = " + jodaTime.getMillisOfSecond());

La sortie est la suivante:

jodaTime = 2010-04-16 18:09:26.060

year = 2010
month = 4
day = 16
hour = 18
minute = 9
second = 26
millis = 60

Selon http://www.joda.org/joda-time/

Joda-Time est la bibliothèque de date et d'heure standard de facto pour Java. À partir de Java SE 8, les utilisateurs sont invités à migrer vers java.time (JSR-310).

Crowne
la source
1
Pour info, le projet Joda-Time est maintenant en maintenance, avec son équipe conseillant la migration vers les classes java.time. Joda-Time et java.time sont dirigés par le même homme, Stephen Colebourne.
Basil Bourque
7
    // Java 8
    System.out.println(LocalDateTime.now().getYear());       // 2015
    System.out.println(LocalDateTime.now().getMonth());      // SEPTEMBER
    System.out.println(LocalDateTime.now().getDayOfMonth()); // 29
    System.out.println(LocalDateTime.now().getHour());       // 7
    System.out.println(LocalDateTime.now().getMinute());     // 36
    System.out.println(LocalDateTime.now().getSecond());     // 51
    System.out.println(LocalDateTime.now().get(ChronoField.MILLI_OF_SECOND)); // 100

    // Calendar
    System.out.println(Calendar.getInstance().get(Calendar.YEAR));         // 2015
    System.out.println(Calendar.getInstance().get(Calendar.MONTH ) + 1);   // 9
    System.out.println(Calendar.getInstance().get(Calendar.DAY_OF_MONTH)); // 29
    System.out.println(Calendar.getInstance().get(Calendar.HOUR_OF_DAY));  // 7
    System.out.println(Calendar.getInstance().get(Calendar.MINUTE));       // 35
    System.out.println(Calendar.getInstance().get(Calendar.SECOND));       // 32
    System.out.println(Calendar.getInstance().get(Calendar.MILLISECOND));  // 481

    // Joda Time
    System.out.println(new DateTime().getYear());           // 2015
    System.out.println(new DateTime().getMonthOfYear());    // 9
    System.out.println(new DateTime().getDayOfMonth());     // 29
    System.out.println(new DateTime().getHourOfDay());      // 7
    System.out.println(new DateTime().getMinuteOfHour());   // 19
    System.out.println(new DateTime().getSecondOfMinute()); // 16
    System.out.println(new DateTime().getMillisOfSecond()); // 174

    // Formatted
    // 2015-09-28 17:50:25.756
    System.out.println(new Timestamp(System.currentTimeMillis()));

    // 2015-09-28T17:50:25.772
    System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH).format(new Date()));

    // Java 8
    // 2015-09-28T17:50:25.810
    System.out.println(LocalDateTime.now());

    // joda time
    // 2015-09-28 17:50:25.839
    System.out.println(DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS").print(new org.joda.time.DateTime()));
myrtille0xff
la source
Cette réponse répond vraiment à la question, qui demandait d'accéder aux composants d'une valeur date-heure (pas les chaînes formatées habituelles).
Basil Bourque
6

Avec Java 8 et versions ultérieures, utilisez le package java.time .

ZonedDateTime.now().getYear();
ZonedDateTime.now().getMonthValue();
ZonedDateTime.now().getDayOfMonth();
ZonedDateTime.now().getHour();
ZonedDateTime.now().getMinute();
ZonedDateTime.now().getSecond();

ZonedDateTime.now()est une méthode statique renvoyant la date-heure actuelle à partir de l'horloge système dans le fuseau horaire par défaut. Toutes les méthodes get renvoient une intvaleur.

Ortomala Lokni
la source
LocalDateTimeest précisément la mauvaise classe pour cela. Faute de tout concept de fuseau horaire ou de décalage par rapport à UTC, il ne peut pas être utilisé pour suivre un moment spécifique, ce n'est pas un point sur la chronologie. Utilisez Instant, ZonedDateTimeou à la OffsetDateTimeplace.
Basil Bourque
Vous avez raison. J'ai modifié ma réponse pour utiliser un fichier ZonedDateTime.
Ortomala Lokni
3

tl; dr

ZonedDateTime.now(                    // Capture current moment as seen in the wall-clock time used by the people of a particular region (a time zone).
    ZoneId.of( "America/Montreal" )   // Specify desired/expected time zone. Or pass `ZoneId.systemDefault` for the JVM’s current default time zone.
)                                     // Returns a `ZonedDateTime` object.
.getMinute()                          // Extract the minute of the hour of the time-of-day from the `ZonedDateTime` object.

42

ZonedDateTime

Pour capturer le moment actuel tel qu'il apparaît dans l'heure de l'horloge murale utilisée par les habitants d'une région particulière (un fuseau horaire), utilisez ZonedDateTime.

Un fuseau horaire est crucial pour déterminer une date. Pour un moment donné, la date varie dans le monde entier par zone. Par exemple, quelques minutes après minuit à Paris France est un nouveau jour alors qu'il est encore «hier» à Montréal Québec .

Si aucun fuseau horaire n'est spécifié, la machine virtuelle Java applique implicitement son fuseau horaire par défaut actuel. Cette valeur par défaut peut changer à tout moment pendant l'exécution (!), Donc vos résultats peuvent varier. Mieux vaut spécifier explicitement votre fuseau horaire souhaité / attendu comme argument.

Indiquez un nom de fuseau horaire approprié dans le format continent/region, tels que America/Montreal, Africa/Casablancaou Pacific/Auckland. N'utilisez jamais l'abréviation de 3 à 4 lettres telle que ESTou ISTcar ce ne sont pas de vrais fuseaux horaires, non standardisés et même pas uniques (!).

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

Appelez l'un des nombreux getters pour extraire des morceaux de la date-heure.

int    year        = zdt.getYear() ;
int    monthNumber = zdt.getMonthValue() ;
String monthName   = zdt.getMonth().getDisplayName( TextStyle.FULL , Locale.JAPAN ) ;  // Locale determines human language and cultural norms used in localizing. Note that `Locale` has *nothing* to do with time zone.
int    dayOfMonth  = zdt.getDayOfMonth() ;
String dayOfWeek   = zdt.getDayOfWeek().getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ; 
int    hour        = zdt.getHour() ;  // Extract the hour from the time-of-day.
int    minute      = zdt.getMinute() ;
int    second      = zdt.getSecond() ;
int    nano        = zdt.getNano() ;

Les classes java.time se résolvent en nanosecondes . Votre question demandait la fraction de seconde en millisecondes . Évidemment, vous pouvez diviser par un million pour tronquer les nanosecondes en millisecondes, au prix d'une éventuelle perte de données. Ou utilisez l' TimeUniténumération pour une telle conversion.

long millis = TimeUnit.NANOSECONDS.toMillis( zdt.getNano() ) ;

DateTimeFormatter

Pour produire un Stringpour combiner des morceaux de texte, utilisez la DateTimeFormatterclasse. Recherchez Stack Overflow pour plus d'informations à ce sujet.

Instant

Il est généralement préférable de suivre les moments en UTC. Pour passer d'une date-heure zonée à UTC, extrayez un fichier Instant.

Instant instant = zdt.toInstant() ;

Et revenir en arrière.

ZonedDateTime zdt = instant.atZone( ZoneId.of( "Africa/Tunis" ) ) ;

LocalDateTime

Quelques autres réponses utilisent la LocalDateTimeclasse. Cette classe n'est pas appropriée pour le suivi des moments réels, des moments spécifiques sur la chronologie, car elle manque intentionnellement de tout concept de fuseau horaire ou de décalage par rapport à UTC.

Alors à quoi sert-il LocalDateTime? À utiliser LocalDateTimelorsque vous avez l'intention d'appliquer une date et une heure à une localité ou à toutes les localités , plutôt qu'à une localité spécifique.

Par exemple, Noël cette année commence au LocalDateTime.parse( "2018-12-25T00:00:00" ). Cette valeur n'a aucune signification tant que vous n'appliquez pas un fuseau horaire (a ZoneId) pour obtenir un fichier ZonedDateTime. Noël a lieu d'abord à Kiribati , puis plus tard en Nouvelle-Zélande et en Extrême-Orient. Quelques heures plus tard, Noël commence en Inde. Plus d'heure plus tard en Afrique et en Europe. Et toujours pas Noël dans les Amériques jusqu'à plusieurs heures plus tard. Noël à partir de tout un lieu doit être représenté avec ZonedDateTime. Noël partout est représenté avec un LocalDateTime.


À propos de java.time

Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que java.util.Date, Calendar, et SimpleDateFormat.

Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .

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

Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de java.sql.*classes.

Où obtenir les classes java.time?

Basil Bourque
la source
2

Ou utilisez java.sql.Timestamp. Le calendrier est un peu lourd, je recommanderais de ne pas l'utiliser dans le code de production. Joda va mieux.

import java.sql.Timestamp;

public class DateTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(new Timestamp(System.currentTimeMillis()));
    }
}
Pavel
la source
Je pense que vous avez mal compris la question et l'utilisation de l'horodatage SQL. Vous utiliseriez normalement new Date()ici. Mais comment en obtiendriez-vous facilement les pièces détachées comme demandé?
BalusC
FYI, a java.sql.Timestampété supplanté par le java.time.Instantavec l'arrivée de JDBC 4.2.
Basil Bourque
0

dans java 7 calendrier une ligne

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(Calendar.getInstance().getTime())
Lucke
la source
1
Les classes ennuyeuses Calendar et SimpleDateFormat sont désormais obsolètes, entièrement supplantées par les classes java.time. Voir la réponse de BalusC pour l'approche moderne. Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 et 7 dans le projet ThreeTen-Backport .
Basil Bourque
-2

Consultez la documentation de l'API pour la classe java.util.Calendar et ses dérivés (vous pouvez être spécifiquement intéressé par la classe GregorianCalendar).

M. Jessup
la source
Pour info, les anciennes classes de date-heure gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont maintenant héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures. Voir le didacticiel d'Oracle .
Basil Bourque
-2

Calendar now = new Calendar () // ou new GregorianCalendar (), ou quelle que soit la saveur dont vous avez besoin

maintenant.MONTH maintenant.HOUR

etc.

llappall
la source
3
Bonjour, j'ai du mal à comprendre pourquoi vous répétez mal une réponse déjà donnée. Veuillez préciser :)
BalusC
3
MONTHet HOURsont des constantes statiques Calendaret non des propriétés d'instance.
Joseph Earl