web-dev-qa-db-fra.com

Comment définir l'heure de l'instance Java.util.Date sur 00:00:00?

J'ai une variable du type Java.util.Date.

Comment puis-je régler l'heure à 00:00:00?

Je ne suis pas autorisé à utiliser une bibliothèque Apache Commons ni JodaTime. Le Java.util.Calendar est probablement ma seule option.

12
Anthony Kong

Pour supprimer complètement l'heure de l'objet Date, vous pouvez utiliser ceci:

public static Date removeTime(Date date) {    
        Calendar cal = Calendar.getInstance();  
        cal.setTime(date);  
        cal.set(Calendar.HOUR_OF_DAY, 0);  
        cal.set(Calendar.MINUTE, 0);  
        cal.set(Calendar.SECOND, 0);  
        cal.set(Calendar.MILLISECOND, 0);  
        return cal.getTime(); 
    }

Passez à la méthode l'objet Date que vous voulez modifier et il retournera une Date qui n'a pas d'heures/minutes, etc.

Si la modification de l'objet Date n'est pas nécessaire, utilisez SimpleDateFormat. Définissez le format comme vous le souhaitez, par exemple. supprimer les heures/minutes. Appelez ensuite la méthode de formatage et transmettez-lui l'objet Date à modifier.

SimpleDateFormat sdf = new SimpleDateFormat("MMM dd,yyyy");
System.out.println(sdf.format(yourDate));
25
Sionnach733

tl; dr

Si vous vouliez dire minuit dans UTC dans un ancien objet Java.util.Date ancien…

Java.util.Date.from(
    OffsetDateTime.of( 
        LocalDate.of( 2017 , Month.JANUARY , 23 ) ,
        LocalTime.MIN ,
        ZoneOffset.UTC
    ).toInstant()
)

Si possible, supprimez la portion Date héritée ci-dessus et utilisez simplement l'objet moderne Java.time.OffsetDateTime ou Java.time.Instant

OffsetDateTime.of( 
    LocalDate.of( 2017 , Month.JANUARY , 23 ) ,
    LocalTime.MIN ,
    ZoneOffset.UTC
).toInstant()

Si vous vouliez parler de minuit dans un fuseau horaire particulier plutôt que de l'UTC…

LocalDate.now()
         .atStartOfDay()

Il est préférable de spécifier votre fuseau horaire souhaité/attendu plutôt que de s’appuyer implicitement sur la configuration par défaut actuelle. 

LocalDate.now( ZoneId.of( "Pacific/Auckland" )  )
         .atStartOfDay( ZoneId.of( "Pacific/Auckland" ) )

Détails

Attention: L'heure de tous les jours dans chaque fuseau horaire n'est pas 00:00:00. L'heure avancée peut atteindre 1 heure du matin, éliminant ainsi minuit.

Java.time

Utilisation de classes Java.time qui supplantent les anciennes classes de date/heure problématiques, telles que Java.util.Date et .Calendar.

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

Convertir vers/à partir des classes héritées

Vous devez vous en tenir aux classes Java.time modernes autant que possible. Mais si vous devez avoir des instances des anciennes classes héritées, vous pouvez convertir en/à partir de Java.time. Regardez à new méthodes ajoutées aux anciennes classes.

Calendar myLegacyCal = GregorianCalendar.from( zdt ) ;

Date myLegacyDate = Date.from( zdt.toInstant() ) ;

Si vous souhaitez qu'un Java.util.Date, qui se trouve toujours dans le fuseau horaire UTC, ait l'heure 00:00:00, utilisez OffsetDateTime avec la constante ZoneOffset.UTC.

OffsetDateTime odt = OffsetDateTime.of( localDate , LocalTime.MIN , ZoneOffset.UTC ) ;
Date myLegacyDate = Date.from( odt.toInstant() ) ;

À 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 maintenance , conseille de migrer vers les classes Java.time .

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

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


Joda-Time

MISE À JOUR: le projet Joda-Time est maintenant en mode maintenance. L'équipe conseille la migration vers les classes Java.time. Cette section est restée intacte comme histoire. 

Utilisez Joda-Time 2.3, avec une méthode servant précisément à cela: withTimeAtStartOfDay () .

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;

DateTime now = new DateTime();
DateTime firstMomentOfToday = now.withTimeAtStartOfDay();

System.out.println( "now: " + now );
System.out.println( "firstMomentOfToday: " + firstMomentOfToday );

Quand couru…

now: 2013-12-05T23:00:23.785-08:00
firstMomentOfToday: 2013-12-05T00:00:00.000-08:00
3
Basil Bourque

En Java 8, 'Java.time.LocalDate.atStartOfDay ()' peut également être utilisé:

    Date date = new Date();
    Instant inst = date.toInstant();
    LocalDate localDate = inst.atZone(ZoneId.systemDefault()).toLocalDate();
    Instant dayInst = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant();
    Date day = Date.from(dayInst);
1
Kayvan Tehrani

Comme @ Sionnach733, pour supprimer l'heure de Date, vous pouvez écrire cette fonction pour votre DateTimeUtils avec clear:

public static Date getDateOnly(final Date input) {
        final Calendar cal = Calendar.getInstance();
        cal.setTime(input);
        cal.clear(Calendar.HOUR_OF_DAY);
        cal.clear(Calendar.MINUTE);
        cal.clear(Calendar.SECOND);
        cal.clear(Calendar.MILLISECOND);
        return cal.getTime();
    }
1
Toi Nguyen