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!
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.
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 LocalDate
tutoriel
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
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
.
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).
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.
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 .
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.
Je vous recommande d'envisager d'utiliser Joda-Time . C'est vraiment mieux que les offres JDK.
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 # :(
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