web-dev-qa-db-fra.com

Comment vérifier si un objet date est égal à hier?

En ce moment j'utilise ce code

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE) - 1, 12, 0, 0); //Sets Calendar to "yeserday, 12am"
if(sdf.format(getDateFromLine(line)).equals(sdf.format(cal.getTime())))                         //getDateFromLine() returns a Date Object that is always at 12pm
{...CODE

Il doit y avoir un moyen plus simple de vérifier si la date retournée par getdateFromLine () est la date d'hier. Seule la date compte, pas l'heure. C'est pourquoi j'ai utilisé SimpleDateFormat. Merci d'avance pour votre aide!

43
tzippy
Calendar c1 = Calendar.getInstance(); // today
c1.add(Calendar.DAY_OF_YEAR, -1); // yesterday

Calendar c2 = Calendar.getInstance();
c2.setTime(getDateFromLine(line)); // your date

if (c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR)
  && c1.get(Calendar.DAY_OF_YEAR) == c2.get(Calendar.DAY_OF_YEAR)) {

Cela fonctionnera également pour des dates comme le 1er janvier.

76

Java.time

En utilisant Java.time framework intégré à Java 8

LocalDate now = LocalDate.now(); //2015-11-24
LocalDate yesterday = LocalDate.now().minusDays(1); //2015-11-23

yesterday.equals(now); //false
yesterday.equals(yesterday); //true

États officiels d'Oracle LocalDatetutoriel

La méthode des égaux doit être utilisée pour les comparaisons.

Si vous travaillez avec des objets tels que LocalDateTime , ZonedDateTime , ou OffsetDateTime =, vous pouvez convertir en LocalDate .

LocalDateTime.now().toLocalDate(); # 2015-11-24
15
Przemek

Je suis d'accord avec Ash Kim que la bibliothèque Joda-Time est le chemin à parcourir si vous voulez préserver votre santé mentale.

import org.joda.time.DateTime;

public static boolean dayIsYesterday(DateTime day) {
    DateTime yesterday = new DateTime().withTimeAtStartOfDay().minusDays(1);
    DateTime inputDay = day.withTimeAtStartOfDay();

    return inputDay.isEqual(yesterday);
}

Dans cet exemple, si DateTime day est d'hier, dayIsYesterday(day) renverra true.

14
plowman

Évitez Java.util.Date & .Calendar

réponse acceptée est techniquement correcte mais moins qu'optimale. Les classes Java.util.Date et .Calendar sont notoirement gênantes. Évite-les. Utilisez soit Joda-Time ou le nouveau package Java.time (in Java 8).

Fuseau horaire

Le fuseau horaire est essentiel dans le travail date-heure. Si vous ignorez le problème, le fuseau horaire par défaut de la JVM sera appliqué. Une meilleure pratique consiste à toujours spécifier plutôt que de s'appuyer sur la valeur par défaut. Même lorsque vous voulez la valeur par défaut, appelez explicitement getDefault.

Le début de la journée est défini par le fuseau horaire. Un nouveau jour se lève plus tôt à Berlin qu'à Montréal. Ainsi, la définition de "aujourd'hui" et "hier" nécessite un fuseau horaire.

Joda-Time

Exemple de code dans Joda-Time 2.3.

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Berlin" );
DateTime today = DateTime.now( timeZone ); 

Une façon de déterminer hier est de convertir en objets LocalDate. Une autre façon, illustrée ici, est de représenter "hier" comme une période de temps. Nous définissons cette durée comme allant du premier moment d'hier à mais sans inclure le premier moment d'aujourd'hui. Cette approche est appelée "semi-ouverte" où le début est inclus et la fin est exclusive .

Soustrayez une journée pour vous rendre à hier (ou la veille).

DateTime yesterdayStartOfDay = today.minusDays( 1 ).withTimeAtStartOfDay();
Interval yesterdayInterval = new Interval( yesterdayStartOfDay, today.withTimeAtStartOfDay() );

Convertissez votre objet Java.util.Date cible en un objet Joda-Time DateTime. Appliquez un fuseau horaire à ce nouvel objet, plutôt que de vous fier à l'application du fuseau horaire par défaut de la JVM. Techniquement, le fuseau horaire ici n'est pas pertinent, mais l'inclusion d'un fuseau horaire est une bonne habitude.

DateTime target = new DateTime( myJUDate, timeZone );

Testez si la cible atterrit dans l'intervalle d'hier.

boolean isYesterday = yesterdayInterval.contains( target );

De toute évidence, cette approche avec une période de temps semi-ouverte fonctionne avec plus que "hier", comme "cette semaine", "le mois dernier", etc.

Mise à jour: Le projet Joda-Time est maintenant en mode maintenance. L'équipe conseille la migration vers les classes Java.time. Voir la solution Java.time dans le réponse correcte de Przemek .

8
Basil Bourque

Au lieu de définir le calendrier, essayez ceci:

public static void main(String[] args) {
    int DAY_IN_MILLIS = 1000 * 60 * 60 * 24;
    Date date = new Date();
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yy");
    String prevDate = dateFormat.format(date.getTime() - DAY_IN_MILLIS);
    String currDate = dateFormat.format(date.getTime());
    String nextDate = dateFormat.format(date.getTime() + DAY_IN_MILLIS);
    System.out.println("Previous date: " + prevDate);
    System.out.println("Current date: " + currDate);
    System.out.println("Next date: " + nextDate);
  }

Cela devrait vous permettre d'avancer et de reculer le long du calendrier

Ensuite, vous pouvez simplement comparer la getDateFromLine (ligne) à la valeur prevDate ou tout ce que vous voulez.

2
gruntled

Je vous recommande d'envisager d'utiliser Joda-Time . C'est vraiment mieux que les offres JDK.

1

Je l'ai trouvé un peu confus lorsque j'utilise cette méthode pour tester cette méthode

 Calendar now = new GregorianCalendar(2000, 1, 1);
 now.add(Calendar.DATE, -1);

 SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd");
 System.out.println(format.format(now.getTime()));

mon attente est d'imprimer 1999-12-31, mais le réel est 2001-1-31 Je suppose que Calendar.add () ne traite que le jour du mois.

Mais l'erreur réelle est la façon dont je crée l'objet Calendar. Dans Calendrier, le mois commence par , la valeur de la variable est maintenant 2001-2-1, j'étais tellement prétentieux que de ne pas l'imprimer. Quand j'ai trouvé que quelque chose n'allait pas. la bonne façon de créer un calendrier est:

 Calendar now = new GregorianCalendar(2000, Calendar.JANUARY, 1);

Le calendrier était tellement bizarre pour un ancien programmeur C # :(

0
Allen

Quelque chose comme ça à peu près:

         Calendar c1 = Calendar.getInstance();
         Date d1 = new Date(/* control time */);
         c1.setTime(d1);

        //current date
        Calendar c2 = Calendar.getInstance();

        int day1=c1.get(Calendar.DAY_OF_YEAR);
        int day2=c2.get(Calendar.DAY_OF_YEAR);

       //day2==day1+1 
0
Inv3r53