comment créer un objet Java Date de minuit aujourd'hui et de minuit demain?

186

Dans mon code, j'ai besoin de trouver toutes mes choses qui se sont passées aujourd'hui. J'ai donc besoin de comparer avec les dates d'aujourd'hui à 00h00 (minuit tôt ce matin) à 12h00 (minuit ce soir).

Je sais ...

Date today = new Date(); 

... me prend tout de suite. Et ...

Date beginning = new Date(0);

... me donne zéro heure le 1er janvier 1970. Mais quel est le moyen facile d'obtenir l'heure zéro aujourd'hui et l'heure zéro demain?

MISE À JOUR; Je l'ai fait, mais il y a sûrement un moyen plus simple?

Calendar calStart = new GregorianCalendar();
calStart.setTime(new Date());
calStart.set(Calendar.HOUR_OF_DAY, 0);
calStart.set(Calendar.MINUTE, 0);
calStart.set(Calendar.SECOND, 0);
calStart.set(Calendar.MILLISECOND, 0);
Date midnightYesterday = calStart.getTime();

Calendar calEnd = new GregorianCalendar();
calEnd.setTime(new Date());
calEnd.set(Calendar.DAY_OF_YEAR, calEnd.get(Calendar.DAY_OF_YEAR)+1);
calEnd.set(Calendar.HOUR_OF_DAY, 0);
calEnd.set(Calendar.MINUTE, 0);
calEnd.set(Calendar.SECOND, 0);
calEnd.set(Calendar.MILLISECOND, 0);
Date midnightTonight = calEnd.getTime();
ROMANIA_engineer
la source
3
À mon avis, Joda Time est plus facile, regardez la fin de ma réponse. Si vous souhaitez utiliser java.util.Date/Calendar, vous devez le faire de cette façon, il n'y a pas de moyen plus simple de le faire.
timaschew du
RE: commentaire timaschew pour utiliser Joda-Time, sachez que le projet Joda-Time est maintenant en mode maintenance, et conseille la migration vers les classes java.time.
Basil Bourque
1
Pour info, les anciennes classes de date-heure terriblement gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont 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 .
Basil Bourque
2
Il est rare de voir autant de réponses imparfaites à une question que celle-ci. Je recommande la réponse de Basil Bourque , elle est correcte et bien informée.
Ole VV

Réponses:

359

java.util.Calendar

// today    
Calendar date = new GregorianCalendar();
// reset hour, minutes, seconds and millis
date.set(Calendar.HOUR_OF_DAY, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);

// next day
date.add(Calendar.DAY_OF_MONTH, 1);

JDK 8 - java.time.LocalTime et java.time.LocalDate

LocalTime midnight = LocalTime.MIDNIGHT;
LocalDate today = LocalDate.now(ZoneId.of("Europe/Berlin"));
LocalDateTime todayMidnight = LocalDateTime.of(today, midnight);
LocalDateTime tomorrowMidnight = todayMidnight.plusDays(1);

Joda-Time

Si vous utilisez un JDK <8, je recommande Joda Time , car l'API est vraiment sympa:

DateTime date = new DateTime().toDateMidnight().toDateTime();
DateTime tomorrow = date.plusDays(1);

La version 2.3 de Joda Time DateMidnightétant obsolète , utilisez donc ceci:

DateTime today = new DateTime().withTimeAtStartOfDay();
DateTime tomorrow = today.plusDays(1).withTimeAtStartOfDay();

Passez un fuseau horaire si vous ne voulez pas le fuseau horaire par défaut actuel de la JVM.

DateTimeZone timeZone = DateTimeZone.forID("America/Montreal");
DateTime today = new DateTime(timeZone).withTimeAtStartOfDay(); // Pass time zone to constructor.
timaschew
la source
Merci pour l'aide, je venais de mettre à jour ma question initiale avec la façon dont je le faisais actuellement. Merci pour la suggestion.
3
Depuis JodaTime 2.3, toDateMidnightest obsolète. Voir cette réponse pour plus de détails: stackoverflow.com/a/19048833/363573
Stephan
a ajouté une solution pour JDK 8
timaschew
1
@timaschew Bien que généralement correct, je suggère de faire le java.time en utilisant une valeur de date-heure zonée ( ZonedDateTime) comme vous l'avez fait dans la section Joda-Time. Les Local…types n'ont aucune information de fuseau horaire - c'est leur but entier, aucune perte / ignorer tous les détails de décalage et de fuseau horaire. D'autant que la question parle de l'utilisation de ces valeurs à des fins de comparaison (peut-être des requêtes de base de données?), Une valeur date-heure zonée est probablement plus utile.
Basil Bourque
1
@Amalgovinus Assurez-vous de définir Calendar.HOUR_OF_DAY, et non Calendar.HOUR.
Oswald
50

Par souci d'exhaustivité, si vous utilisez Java 8, vous pouvez également utiliser la truncatedTométhode de la Instantclasse pour obtenir minuit en UTC .

Instant.now().truncatedTo(ChronoUnit.DAYS);

Comme écrit dans le Javadoc

Par exemple, la troncature avec l'unité MINUTES arrondira à la minute la plus proche, mettant les secondes et les nanosecondes à zéro.

J'espère que cela aide.

riccardo.cardin
la source
1
Merci pour l'indice. Obtenir le minuit au fuseau horaire spécifié devient plus long:Date.from(date.toInstant().atZone(ZoneId.systemDefault()).truncatedTo(ChronoUnit.DAYS).toInstant())
Vadzim
4
Méfiez-vous de la différence entre truncatedToetatStartOfDay .
Vadzim
34

Le moyen le plus simple de trouver un minuit:

Long time = new Date().getTime();
Date date = new Date(time - time % (24 * 60 * 60 * 1000));

Le prochain jour:

Date date = new Date(date.getTime() + 24 * 60 * 60 * 1000);
Andrei Volgin
la source
J'ai couru ce code et j'ai obtenu: Midnight: Thu Nov 01 19:00:00 CDT 2012
Dave
3
Si vous avez fait quelque chose comme System.out.print (date), le système a converti l'instance de date dans le fuseau horaire système (CDT). 19h à CDT est minuit à GMT. Si vous avez besoin d'un minuit dans un fuseau horaire sélectionné, vous devez ajouter le décalage de ce fuseau horaire en tenant compte de l'heure d'été.
Andrei Volgin
@Bouncner Ça l'est. Il existe de nombreuses heures de «minuit» différentes sur Terre, quelle que soit la méthode que vous utilisez, mais il n'y a qu'une seule minuit Java.
Andrei Volgin
2
@Andrei Volgin Je ne savais pas qu'il y avait un "java minuit". ;) Ce que je voulais dire c'est que cette solution n'aide pas vraiment le créateur du sujet. Une solution de calendrier évite les calculs de seconde laid et prend en charge les fuseaux horaires (et en particulier les heures d'économie de jour, etc.) lorsqu'elle est utilisée correctement. Je ne vois pas cela dans votre solution.
Bouncner
Salut @AndreiVolgin, j'ai obtenu avec Date date = new Date (time + TimeZone.getDefault (). GetRawOffset () - time% (24 * 60 * 60 * 1000));
jrey
29

N'oubliez pas, Daten'est pas utilisé pour représenter les dates (!). Pour représenter la date, vous avez besoin d'un calendrier. Ce:

Calendar c = new GregorianCalendar();

créera une Calendarinstance représentant la date actuelle dans votre fuseau horaire actuel. Maintenant, ce dont vous avez besoin est de tronquer chaque champ sous jour (heure, minute, seconde et milliseconde) en le définissant sur 0. Vous avez maintenant minuit aujourd'hui.

Maintenant, pour obtenir minuit le lendemain, vous devez ajouter un jour:

c.add(Calendar.DAY_OF_MONTH, 1);

Notez que l'ajout de 86400secondes ou de 24 heures est incorrect en raison de l'heure d'été qui peut se produire entre-temps.

MISE À JOUR: Cependant, ma façon préférée de résoudre ce problème est d'utiliser la classe DateUtils de Commons Lang :

Date start = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH))
Date end = DateUtils.addDays(start, 1);

Il utilise Calendarles coulisses ...

Tomasz Nurkiewicz
la source
15
Merci pour l'aide. "La date n'est pas utilisée pour représenter les dates" - nous sommes vraiment géniaux, n'est-ce pas? ;)
@RobertHume Pour être honnête, Date existe depuis la première version de Java. La plupart des choses de cette époque sont ... loin d'être parfaitement pensées. D'autant plus que Java a été parmi les premiers à essayer le genre de choses qu'il essayait, et qu'il y avait loin d'un standard convenu sur la façon de le faire.
Fund Monica's Lawsuit
14

ces méthodes vous aideront-

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

et

public static Date getEndOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.set(Calendar.HOUR_OF_DAY, 23);
    calendar.set(Calendar.MINUTE, 59);
    calendar.set(Calendar.SECOND, 59);
    calendar.set(Calendar.MILLISECOND, 999);
    return calendar.getTime();
}
Visvendra Singh Rajpoot
la source
9

Depuis JodaTime 2.3, le toDateMidnight() est obsolète.

De mise à niveau de la version 2.2 à la version 2.3

    Dépréciations depuis la version 2.2
    ----------------------
    - DateMidnight [# 41]
     Cette classe a un concept défectueux
     L'heure de minuit ne se produit parfois pas dans certains fuseaux horaires
     Ceci est le résultat d'une heure d'été de 00h00 à 01h00
     DateMidnight est essentiellement un DateTime avec une heure verrouillée à minuit
     Un tel concept est plus généralement médiocre à utiliser, étant donné LocalDate
     Remplacez DateMidnight par LocalDate
     Ou remplacez-le par DateTime, peut-être en utilisant la méthode withTimeAtStartOfDay ()

Voici un exemple de code sans toDateMidnight()méthode.

Code

DateTime todayAtMidnight = new DateTime().withTimeAtStartOfDay();
System.out.println(todayAtMidnight.toString("yyyy-MM-dd HH:mm:ss"));

Sortie ( peut être différente selon votre fuseau horaire local )

2013-09-28 00:00:00
Stephan
la source
2
Excellente réponse. Je ferais l'ajout de passer une DateTimeZoneinstance à ce DateTimeconstructeur pour souligner l'importance de spécifier un fuseau horaire plutôt que par inadvertance en fonction de la valeur par défaut:DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
Basil Bourque
9

D'autres réponses sont correctes, en particulier la réponse java.time par arganzheng . Comme certains l'ont mentionné, vous devriez éviter les anciennes classes java.util.Date/.Calendar car elles sont mal conçues, déroutantes et gênantes. Ils ont été supplantés par les classes java.time.

Permettez-moi d'ajouter des notes sur la stratégie concernant la gestion de minuit et les intervalles de temps .

À moitié ouvert

Dans le travail de date-heure, les intervalles de temps sont souvent définis à l'aide de l'approche «semi-ouverte». Dans cette approche, le début est inclusif tandis que la fin est exclusive . Cela résout les problèmes et, s'il est utilisé de manière cohérente, facilite grandement le raisonnement sur votre gestion de la date et de l'heure.

Un problème résolu est de définir la fin de la journée. Le dernier moment de la journée est-il 23:59:59.999( millisecondes )? Peut-être, dans la classe java.util.Date (du premier Java; gênant - évitez cette classe!) Et dans la bibliothèque Joda-Time très réussie . Mais dans d'autres logiciels, tels que des bases de données comme Postgres, le dernier moment sera 23:59:59.999999( microsecondes ). Mais dans d'autres logiciels tels que le framework java.time (intégré à Java 8 et versions ultérieures, successeur de Joda-Time) et dans certaines bases de données telles que H2 Database , le dernier moment pourrait être 23:59.59.999999999( nanosecondes ). Plutôt que de couper les cheveux, pensez uniquement au premier moment, pas au dernier moment.

En demi-ouverture, une journée court à partir du premier moment d'une journée et s'étend jusqu'au premier moment du jour suivant, mais n'inclut pas . Alors plutôt que de penser comme ça:

… À partir d'aujourd'hui à 00h00 (minuit tôt ce matin) à 12h00 (minuit ce soir).

… Pense comme ça…

depuis le premier moment d'aujourd'hui jusqu'au premier moment de demain, mais sans l'inclure:
(> = 00:00:00.0aujourd'hui ET < 00:00:00.0demain)

Dans le travail de base de données, cette approche signifie ne pas utiliser l' BETWEENopérateur dans SQL.

Début de la journée

De plus, le premier moment de la journée n'est pas toujours l'heure de la journée 00:00:00.0. L'heure d'été (DST) dans certains fuseaux horaires, et éventuellement d'autres anomalies, peut signifier qu'une heure différente commence la journée.

Laissez donc les classes java.time faire le travail de déterminer le début d'une journée avec un appel à LocalDate::atStartOfDay( ZoneId ). Nous devons donc faire un détour LocalDateet revenir ZonedDateTimecomme vous pouvez le voir dans cet exemple de code.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( zoneId );
ZonedDateTime tomorrowStart = todayStart.plusDays( 1 );

Notez le passage de l'option ZoneId. S'il est omis, le fuseau horaire par défaut actuel de votre JVM est appliqué implicitement. Mieux vaut être explicite.

Le fuseau horaire est crucial pour le travail date-heure. La question et certaines autres réponses sont potentiellement défectueuses car elles ne gèrent pas consciemment le fuseau horaire.

Convertir

Si vous devez utiliser un java.util.Date ou un .Calendar, recherchez les nouvelles méthodes de conversion ajoutées à ces anciennes classes.

java.util.Date utilDate = java.util.Date.from( todayStart.toInstant() );
java.util.GregorianCalendar gregCal = java.util.GregorianCalendar.from( todayStart );

Période de temps

À propos, si vous travaillez beaucoup avec des intervalles de temps, jetez un œil à:

  • Duration
  • Period
  • Interval
    La Intervalclasse se trouve dans le projet ThreeTen-Extra , une extension du framework java.time. Ce projet est le terrain d'essai pour d'éventuels futurs ajouts à java.time.
    Interval todayMontreal = Interval.of( todayStart.toInstant() , tomorrowStart.toInstant() );

À propos de java.time

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 , maintenant 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?

Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels futurs ajouts à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval, YearWeek, YearQuarteret plus .

Basil Bourque
la source
6

java.time

Si vous utilisez Java 8 et versions ultérieures, vous pouvez essayer le package java.time ( Tutoriel ):

LocalDate tomorrow = LocalDate.now().plusDays(1);
Date endDate = Date.from(tomorrow.atStartOfDay(ZoneId.systemDefault()).toInstant());
arganzheng
la source
2
Bonne réponse. Je suggérerais de spécifier le fuseau horaire souhaité / attendu. Le fuseau horaire par défaut actuel de la JVM peut varier en fonction des paramètres du système d'exploitation, du changement d'ordinateurs ou de toute application de n'importe quel thread de la JVM, modifiant la valeur par défaut à tout moment pendant l'exécution.
Basil Bourque
4

Cela semble être une option:

DateFormat justDay = new SimpleDateFormat("yyyyMMdd");
Date thisMorningMidnight = justDay.parse(justDay.format(new Date()));

pour y ajouter un jour, soit

Date tomorrow = new Date(thisMorningMidnight.getTime() + 24 * 60 * 60 * 1000);

ou

Calendar c = Calendar.getInstance();
c.setTime(thisMorningMidnight);
c.add(Calendar.DATE, 1);
Date tomorrowFromCalendar = c.getTime();

J'ai une idée que ce dernier est préféré en cas de quelque chose de bizarre comme l'heure d'été, ce qui fait que l'ajout de 24 heures ne suffit pas (voir https://stackoverflow.com/a/4336131/32453 et ses autres réponses).

rogerdpack
la source
J'ai une date et une heure représentées comme un long dans ma base de données sqlite. J'ai besoin d'un long pour le début du lendemain. Puis-je toujours utiliser un objet Date avec mon long plutôt qu'avec la méthode SimpleDateFormat que vous utilisez ci-dessus?
AJW
1
Tant que ce sont les bonnes millisecondes, vous pouvez le passer en tant que constructeur: docs.oracle.com/javase/7/docs/api/java/util/…
rogerdpack
1

Je l'ai fait différemment de tout le monde ici. Je suis nouveau sur Java, donc ma solution est peut-être mauvaise.

Date now = new Date();
Date midnightToday = new Date(now.getYear(), now.getMonth(), now.getDate());

Je ne suis pas sûr que cela fonctionne encore, mais de toute façon, j'apprécierais tout commentaire sur cette solution.

Je suis confus par la déclaration ci-dessus que vous pouvez calculer demain en appelant:

c.add(Calendar.DAY_OF_MONTH, 1);

Si vous ajoutez 1 au jour du mois et que c'est le 31e jour, n'obtenez-vous pas le 32e jour du mois?

Pourquoi les heures / dates ne sont-elles pas toutes basées sur UTC en Java? Je pense que les fuseaux horaires ne devraient être nécessaires que lorsqu'ils sont utilisés avec i / o, mais en interne, ils devraient toujours être utilisés en UTC. Cependant, les classes semblent inclure des informations sur le fuseau horaire qui semblent non seulement inutiles, mais sujettes à des erreurs de codage.

Mitch
la source
2
Salut Mitch. Je pense que votre solution fonctionne, mais il semble que ce constructeur Date soit obsolète. Les gens de Java ont désapprouvé la plupart des méthodes originales liées à Date il y a quelque temps et les ont remplacées par des méthodes plus récentes liées au calendrier. Personnellement, je ne vois pas en quoi c'est une amélioration, mais il est mal vu d'utiliser des méthodes obsolètes. Merci!
Triste de la dépréciation. Il me semble beaucoup plus propre de spécifier l'année, le mois et la date plutôt que d'effacer les heures, les minutes, les secondes et les millisecondes. Pour les effacer, les millisecondes sont la plus fine granularité de la classe Date, contrairement à ma solution. Ma solution est également plus courte et plus claire. Être nouveau sur Java me fait vraiment apprécier à quel point le C ++ est propre, facile et efficace lorsqu'il s'agit d'utiliser les dates et les heures.
Mitch le
@Mitch D'après mon expérience, la langue la plus récente que vous apprenez est toujours perçue comme la plus compliquée.
ArtOfWarfare
Pour info: ces horribles vieilles classes de date-heure sont désormais héritées, supplantées par les classes java.time modernes.
Basile Bourque
0

Le moyen le plus simple avec JodaTime

DateMidnight date = DateMidnight.now();

Javier Sculli
la source
2
Non. Les classes et méthodes liées à "minuit" dans Joda-Time sont toutes obsolètes. Ils étaient basés sur un concept défectueux. Le premier moment de la journée n'est pas toujours 00:00:00.000. Utilisez plutôt la nouvelle withTimeAtStartOfDayméthode. Mettez à jour vers la version actuelle 2.4 de Joda-Time et lisez les notes de publication. Exemple:DateTime today = DateTime.now( DateTimeZone.forID( "America/Montreal" ) ).withTimeAtStartOfDay();
Basil Bourque
0

Parce qu'un jour est 24 * 60 * 60 * 1000ms, le minuit de ce jour peut être calculé comme ...

long now = System.currentTimeMillis();
long delta = now % 24 * 60 * 60 * 1000;
long midnight = now - delta;
Date midnightDate = new Date(midnight);`
lshu
la source
1
Ce code s'applique uniquement à UTC et à aucun autre fuseau horaire, et ignore les anomalies telles que l'heure d'été. De plus, les solutions de date-heure à rouler soi-même ne sont pas judicieuses car il s'agit d'un sujet étonnamment délicat. Utilisez plutôt les excellentes classes java.time.
Basil Bourque
0

À peu près comme les réponses précédentes, mais personne n'a mentionné le paramètre AM_PM:

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    cal.set(Calendar.AM_PM, Calendar.AM);
Montaser
la source
1
La Calendarclasse gênante a été remplacée il y a des années par les classes java.time , en particulier ZonedDateTime.
Basil Bourque
0
Date now= new Date();
// Today midnight
Date todayMidnight = new Date(endTime.getTime() -endTime.getTime()%DateUtils.MILLIS_PER_DAY);

// tomorrow midnight
Date tomorrowMidnight = new Date(endTime.getTime() -endTime.getTime()%DateUtils.MILLIS_PER_DAY + DateUtils.MILLIS_PER_DAY);
gzg_55
la source
Cela ne fonctionne que pour UTC et ne parvient pas à traiter les fuseaux horaires. En outre, la Dateclasse terrible a été supplantée il y a des années par java.time.Instant. Évitez d'utiliser de Datenos jours.
Basil Bourque
0

Utilisation d’apache commons.

//For midnight today 
Date today = new Date(); 
DateUtils.truncate(today, Calendar.DATE);

//For midnight tomorrow   
Date tomorrow = DateUtils.addDays(today, 1); 
DateUtils.truncate(tomorrow, Calendar.DATE);
joe4java
la source
Pour info, les anciennes classes de date-heure terriblement gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont 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 .
Basil Bourque
@BasilBourque D'accord pour Java 8. Mais si OP utilise Java 7, je suppose que cela fonctionnerait.
joe4java
Presque toutes les fonctionnalités java.time sont disponibles pour Java 6 & 7 dans le projet ThreeTen-Backport avec une API pratiquement identique. Adapté pour Android <26 dans le projet ThreeTenABP . Donc pas besoin de plus jamais utiliser ces vieilles classes de date-heure misérables.
Basil Bourque
-1

Je sais que c'est un très vieux poste. J'ai pensé partager mes connaissances ici!

Pour la date Mid night aujourd'hui avec le fuseau horaire exact, vous pouvez utiliser ce qui suit

public static Date getCurrentDateWithMidnightTS(){

    return new Date(System.currentTimeMillis() - (System.currentTimeMillis()%(1000*60*60*24)) - (1000*60 * 330));
}

(1000*60 * 330)est soustrait, c'est-à-dire réellement lié au fuseau horaire, par exemple le fuseau horaire indien, c'est-à-dire que Kolkata diffère de +5: 30hrs du réel. Donc soustraire cela avec la conversion en millisecondes.

Alors changez le dernier numéro soustrait selon vous. Je crée un produit, c'est-à-dire uniquement basé en Inde. Je viens donc d'utiliser un horodatage spécifique.

Rajeev
la source
1
Pourquoi suggérez-vous ceci au lieu de la réponse acceptée? Le roulement de vos valeurs date-heure est en général risqué. En particulier, ce code est codé en dur sur le décalage actuel d'un fuseau horaire unique pour toujours. Il n'y a pas de prise en compte de l'heure d'été ou d'autres anomalies. Je ne vois que des inconvénients sans valeur ajoutée.
Basil Bourque
@Basil bien sûr, j'accepte la réponse et oui, je l'ai mentionné pour une valeur codée en dur. Cela n'est utile que si vous travaillez sur un fuseau horaire spécifique.
Rajeev
-1
Date todayMidnightUTC = java.sql.Date.valueOf(LocalDate.now());
Date tomorrowMidnightUTC = java.sql.Date.valueOf(LocalDate.now().plusDays(1));
Date anyMidnightLocal = java.sql.Date.valueOf(LocalDate.from(dateTime.toInstant().atZone(ZoneId.systemDefault())));

Mais attention, ça java.sql.Date.toInstant()jette toujours UnsupportedOperationException.

Via LocalDate vers java.util.Date et vice versa la conversion la plus simple?

Vadzim
la source
Pas une bonne réponse. Vous mélangez l'utilisation du java.time moderne avec les anciennes classes héritées qu'ils supplantent. Et plus précisément, vous utilisez les classes date-heure java.sql qui ne doivent être utilisées que pour échanger des données avec une base de données dont le pilote n'a pas encore été mis à jour pour traiter directement les classes java.time, à ne jamais utiliser pour la logique métier. Un autre problème est que vous ignorez la question cruciale du fuseau horaire.
Basil Bourque
@BasilBourque, merci pour la critique. L'utilisation d'une classe héritée qui n'est pas marquée comme obsolète pour obtenir une autre instance de classe héritée est assez sûre. Le problème du fuseau horaire est plus important. J'ai décidé de m'en tenir à la réponse de Riccardo après tout.
Vadzim le
-1

À l'ancienne.

private static Date getDateWithMidnight(){
    long dateInMillis = new Date().getTime();
    return new Date(dateInMillis - dateInMillis%(1000*60*60*24) - TimeZone.getDefault().getOffset(dateInMillis));
}
Prabath
la source
Cette classe gênante a été remplacée il y a des années par la classe java.time.Instant . Pas besoin de jamais utiliser Date.
Basil Bourque
Cette Dateclasse est toujours en UTC. Vous ignorez donc le problème du fuseau horaire souhaité / attendu. Par exemple, un nouveau jour se lève à Calcutta en Inde plusieurs heures plus tôt qu'à UTC, et quelques heures plus tard que UTC à Montréal, Québec.
Basil Bourque