Réponses:
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
ou DateTimeFormatter
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
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).
// 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()));
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 int
valeur.
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. Utilisez Instant
, ZonedDateTime
ou à la OffsetDateTime
place.
ZonedDateTime
.
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/Casablanca
ou Pacific/Auckland
. N'utilisez jamais l'abréviation de 3 à 4 lettres telle que EST
ou IST
car 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 String
pour combiner des morceaux de texte, utilisez la DateTimeFormatter
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
.
Instant instant = zdt.toInstant() ;
Et revenir en arrière.
ZonedDateTime zdt = instant.atZone( ZoneId.of( "Africa/Tunis" ) ) ;
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
? À utiliser LocalDateTime
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 (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
.
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?
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()));
}
}
new Date()
ici. Mais comment en obtiendriez-vous facilement les pièces détachées comme demandé?
java.sql.Timestamp
été supplanté par le java.time.Instant
avec l'arrivée de JDBC 4.2.
dans java 7 calendrier une ligne
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(Calendar.getInstance().getTime())
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).
java.util.Date
, java.util.Calendar
et java.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.
MONTH
et HOUR
sont des constantes statiques Calendar
et non des propriétés d'instance.