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.
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));
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" ) )
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.
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 );
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() ) ;
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 _.
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
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);
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();
}