web-dev-qa-db-fra.com

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

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();
154
Robert Hume

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 agréable:

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

</ strike>

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.
299
timaschew

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);
31
Andrei Volgin

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

28
Tomasz Nurkiewicz

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.

26
riccardo.cardin

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();
}
11

À compter de JodaTime 2.3, la toDateMidnight() est obsolète.

De Mise à niveau de 2.2 à 2.3

 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
8
Stephan

Java.time

Si vous utilisez Java 8 ou une version ultérieure, vous pouvez essayer le package Java.time ( Tutorial ):

LocalDate tomorrow = LocalDate.now().plusDays(1);
Date endDate = Date.from(tomorrow.atStartOfDay(ZoneId.systemDefault()).toInstant());
6
arganzheng

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

4
rogerdpack

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. 

2
Mitch

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

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);`
1
lshu

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);
0
joe4java
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);
0
gzg_55

La manière la plus simple avec JodaTime

DateMidnight date = DateMidnight.now();

0
Javier Sculli