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
.
104
Vous pouvez utiliser les getters de java.time.LocalDateTime
pour 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 int
en 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
SimpleDateFormat
ouDateTimeFormatter
pour cette tâche particulière :)new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
Passez à joda-time et vous pouvez le faire en trois lignes
Vous avez également un accès direct aux champs individuels de la date sans utiliser de calendrier.
La sortie est la suivante:
Selon http://www.joda.org/joda-time/
la source
la source
Avec Java 8 et versions ultérieures, utilisez le package java.time .
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 uneint
valeur.la source
LocalDateTime
est 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. UtilisezInstant
,ZonedDateTime
ou à laOffsetDateTime
place.ZonedDateTime
.tl; dr
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 queAmerica/Montreal
,Africa/Casablanca
ouPacific/Auckland
. N'utilisez jamais l'abréviation de 3 à 4 lettres telle queEST
ouIST
car ce ne sont pas de vrais fuseaux horaires, non standardisés et même pas uniques (!).Appelez l'un des nombreux getters pour extraire des morceaux de la date-heure.
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.DateTimeFormatter
Pour produire un
String
pour combiner des morceaux de texte, utilisez laDateTimeFormatter
classe. 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
.Et revenir en arrière.
LocalDateTime
Quelques autres réponses utilisent la
LocalDateTime
classe. 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
? À utiliserLocalDateTime
lorsque 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 (aZoneId
) pour obtenir un fichierZonedDateTime
. 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é avecZonedDateTime
. Noël partout est représenté avec unLocalDateTime
.À 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
, etSimpleDateFormat
.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?
la source
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.
la source
new Date()
ici. Mais comment en obtiendriez-vous facilement les pièces détachées comme demandé?java.sql.Timestamp
été supplanté par lejava.time.Instant
avec l'arrivée de JDBC 4.2.dans java 7 calendrier une ligne
la source
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).
la source
java.util.Date
,java.util.Calendar
etjava.text.SimpleDateFormat
sont 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 .Calendar now = new Calendar () // ou new GregorianCalendar (), ou quelle que soit la saveur dont vous avez besoin
maintenant.MONTH maintenant.HOUR
etc.
la source
MONTH
etHOUR
sont des constantes statiquesCalendar
et non des propriétés d'instance.