web-dev-qa-db-fra.com

Définir la date sur une seule ligne

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).

40
hibernate

Vous pourriez utiliser

new SimpleDateFormat( "yyyyMMdd" ).parse( "20100520" )
21
tangens

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);
14
Sean Owen

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 );
9
martin clayton

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);
5
Jesper

tl; dr

LocalDate.of( 2015 , Month.JUNE , 7 )  // Using handy `Month` enum. 

…ou…

LocalDate.of( 2015 , 6 , 7 )  // Sensible numbering, 1-12 for January to December. 

Java.time

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 );

Convertir

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 );

À propos de Java.time

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 _.

4
Basil Bourque
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

2
Cheng

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;

0
GAbriel lopez