Selon l'API Java, le constructeur Date(year, month, day)
est amorti. Je sais que je peux le remplacer par le code suivant:
Calendar myCal = Calendar.getInstance();
myCal.set(Calendar.YEAR, theYear);
myCal.set(Calendar.MONTH, theMonth);
myCal.set(Calendar.DAY_OF_MONTH, theDay);
Date theDate = myCal.getTime();
Cependant, je voudrais quelque chose de plus court pour le remplacer par (idéalement une à deux lignes).
Vous pourriez utiliser
new SimpleDateFormat( "yyyyMMdd" ).parse( "20100520" )
C'est encore une autre raison d'utiliser Joda Time
new DateMidnight(2010, 3, 5)
DateMidnight est maintenant obsolète, mais le même effet peut être obtenu avec Joda Time DateTime
DateTime dt = new DateTime(2010, 3, 5, 0, 0);
Le calendrier a une méthode set () qui permet de définir l'année, le mois et le jour du mois en un appel:
myCal.set( theYear, theMonth, theDay );
Pourquoi n'écrivez-vous pas simplement une méthode utilitaire:
public final class DateUtils {
private DateUtils() {
}
public static Calendar calendarFor(int year, int month, int day) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month);
cal.set(Calendar.DAY_OF_MONTH, day);
return cal;
}
// ... maybe other utility methods
}
Et appelez cela partout dans le reste de votre code:
Calendar cal = DateUtils.calendarFor(2010, Calendar.MAY, 21);
LocalDate.of( 2015 , Month.JUNE , 7 ) // Using handy `Month` enum.
…ou…
LocalDate.of( 2015 , 6 , 7 ) // Sensible numbering, 1-12 for January to December.
Le framework Java.time intégré à Java 8 et ultérieur supplante les anciennes classes problématiques, Java.util.Date/.Calendar.
Les classes Java.time utilisent objets immuables . Donc, ils sont intrinsèquement thread-safe. Vous n'aurez aucun des thread-safety problèmes mentionnés dans les autres réponses.
LocalDate
Ce cadre comprenait une classe pour les objets à date uniquement sans heure ni fuseau horaire, LocalDate
. Notez qu'un fuseau horaire (ZoneId
) est nécessaire pour déterminer une date.
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
Vous pouvez instancier pour une date spécifique. Notez que le nombre de mois est une plage sensible de 1 à 12 contrairement aux anciennes classes.
LocalDate localDate = LocalDate.of( 2015 , 6 , 7 );
Ou utilisez l'énumération, Month
.
LocalDate localDate = LocalDate.of( 2015 , Month.JUNE , 7 );
Préférable d'éviter les anciennes classes date-heure. Mais si vous devez, vous pouvez convertir. Appelez de nouvelles méthodes ajoutées aux anciennes classes pour faciliter les conversions.
Dans ce cas, nous devons spécifier une heure pour accompagner notre valeur de date uniquement, à combiner pour un objet Java.util.Date
. Le premier moment de la journée a probablement du sens. Laissez Java.time déterminer l’heure de ce premier moment, car ce n’est pas toujours 00:00:00.0
.
Nous devons également spécifier un fuseau horaire, car la date varie selon le fuseau horaire.
ZoneId zoneId = zoneId.of( "America/Montreal" );
ZonedDateTime zdt = localDate.atStartOfDay( zoneId );
Une Instant
est une classe de base dans Java.time, représentant un moment sur la timeline en UTC. Entrez une Instant
dans la méthode statique le Date à convertir.
Instant instant = zdt.toInstant();
Java.util.Date utilDate = Java.util.Date.from( instant );
Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes gênantes héritées _ date-heure telles que Java.util.Date
, Calendar
_, & SimpleDateFormat
.
Le projet Joda-Time , désormais en mode { mode maintenance }, conseille la migration vers les classes Java.time .
Pour en savoir plus, consultez le Oracle Tutorial . 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 une version ultérieure. Pas besoin de chaînes, pas besoin de Java.sql.*
classes.
Où obtenir les classes Java.time?
Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts à Java.time. Vous pouvez y trouver des classes utiles telles que Interval
_, YearWeek
, YearQuarter
_ et plus _.
Date date = new DateTime(2014, 6, 20, 0, 0).toDate();
DateTime: Joda.org https://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html
Utilisez le constructeur Date(year,month,date)
en Java 8, il est obsolète:
Date date = new Date(1990, 10, 26, 0, 0);
Le meilleur moyen est d'utiliser SimpleDateFormat
DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
Date date = format.parse("26/10/1985");
vous devez importer import Java.text.SimpleDateFormat;