Dans mon code, j'ai besoin de retrouver toutes les choses qui me sont arrivées aujourd'hui. Je dois donc comparer les dates d'aujourd'hui à 00h00 (minuit tôt ce matin) à 12h00 (minuit ce soir).
Je connais ...
Date today = new Date();
... me prend maintenant. Et ...
Date beginning = new Date(0);
... me donne zéro heure le 1er janvier 1970. Mais quel est le moyen le plus simple d’obtenir une heure zéro aujourd'hui et une heure demain?
METTRE À JOUR; Je l'ai fait, mais il y a sûrement un moyen plus facile?
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();
// 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);
LocalTime midnight = LocalTime.MIDNIGHT;
LocalDate today = LocalDate.now(ZoneId.of("Europe/Berlin"));
LocalDateTime todayMidnight = LocalDateTime.of(today, midnight);
LocalDateTime tomorrowMidnight = todayMidnight.plusDays(1);
Si vous utilisez un JDK <8, je recommande Joda Time , car l’API est vraiment agréable:
DateTime date = new DateTime().toDateMidnight().toDateTime();
DateTime tomorrow = date.plusDays(1);
Puisque la version 2.3 de Joda Time DateMidnight
est deprecated, utilisez ceci:
DateTime today = new DateTime().withTimeAtStartOfDay();
DateTime tomorrow = today.plusDays(1).withTimeAtStartOfDay();
Passez un fuseau horaire si vous ne souhaitez pas que le fuseau horaire par défaut de la machine virtuelle Java soit utilisé.
DateTimeZone timeZone = DateTimeZone.forID("America/Montreal");
DateTime today = new DateTime(timeZone).withTimeAtStartOfDay(); // Pass time zone to constructor.
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);
Rappelez-vous que Date
n'est pas utilisé pour représenter dates (!). Pour représenter la date, vous avez besoin d'un calendrier. Ce:
Calendar c = new GregorianCalendar();
créera une instance Calendar
représentant la date actuelle dans votre fuseau horaire actuel. Maintenant, vous devez tronquer chaque champ en dessous de jour (heure, minute, seconde et milliseconde) en le définissant sur 0
. Vous avez maintenant un minuit aujourd'hui.
Maintenant, pour avoir minuit le lendemain, il faut ajouter un jour:
c.add(Calendar.DAY_OF_MONTH, 1);
Notez que l'ajout de 86400
secondes ou 24 heures est incorrect en raison de l'heure d'été susceptible de se produire entre-temps.
MISE À JOUR: Cependant, ma façon préférée de traiter ce problème consiste à utiliser DateUtils class à partir de Commons Lang :
Date start = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH))
Date end = DateUtils.addDays(start, 1);
Il utilise Calendar
dans les coulisses ...
Par souci d'exhaustivité, si vous utilisez Java 8, vous pouvez également utiliser la méthode truncatedTo
de la classe Instant
pour obtenir minuit dans UTC .
Instant.now().truncatedTo(ChronoUnit.DAYS);
Comme écrit dans le Javadoc
Par exemple, le fait de tronquer avec l’unité MINUTES arrondira à la minute la plus proche, mettant les secondes et les nanosecondes à zéro.
J'espère que ça aide.
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();
}
À compter de JodaTime 2.3, la toDateMidnight()
est obsolète.
Déprécations depuis le 2.2 ---------------------- - DateMidnight [# 41] Cette classe est défectueuse dans son concept L’heure de minuit ne se présente 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 pauvre à utiliser, étant donné LocalDate Remplacez DateMidnight par LocalDate Ou remplacez-le par DateTime, en utilisant peut-être la méthode withTimeAtStartOfDay ()
Voici un exemple de code sans la méthode toDateMidnight()
.
Code
DateTime todayAtMidnight = new DateTime().withTimeAtStartOfDay();
System.out.println(todayAtMidnight.toString("yyyy-MM-dd HH:mm:ss"));
Sortie (peut être différent en fonction de votre fuseau horaire local} _)
2013-09-28 00:00:00
Cela semble être une option:
DateFormat justDay = new SimpleDateFormat("yyyyMMdd");
Date thisMorningMidnight = justDay.parse(justDay.format(new Date()));
d'ajouter un jour à cela, 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();
Je me rends compte que ce dernier est préférable dans le cas de quelque chose de bizarre, comme l’économie de l’heure entraînant l’ajout de 24 heures pour ne pas suffire (voir https://stackoverflow.com/a/4336131/32453 et ses autres réponses).
Je l'ai fait différemment de tous les autres ici. Je suis nouveau sur Java, alors peut-être que ma solution est médiocre.
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 dans tous les cas, j'apprécierais tout commentaire sur cette solution.
La déclaration ci-dessus me laisse perplexe: vous pouvez calculer le lendemain 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 l'UTC en Java? Je pense que les fuseaux horaires ne devraient être nécessaires que lorsqu'ils sont utilisés avec e/s, mais en interne, ils devraient toujours être utilisés en UTC. Cependant, les classes semblent inclure des informations sur le fuseau horaire, ce qui semble non seulement inutile, mais source d’erreurs de codage.
Comme dans 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);
A cause d'un jour, c'est 24 * 60 * 60 * 1000
ms, 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);`
Utiliser 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);
Apache Commons Lang
DateUtils.isSameDay(date1, date2)
http://commons.Apache.org/proper/commons-lang/javadocs/api-2.6/org/Apache/commons/lang/time/DateUtils.html#isSameDay(Java.util.Date , Java. util.Date)
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);
La manière la plus simple avec JodaTime
DateMidnight date = DateMidnight.now();