Comment puis-je déterminer si une date se situe entre deux dates en Java?

Comment puis-je vérifier si une date est comprise entre deux autres dates, dans le cas où les trois dates sont représentées par des instances de java.util.Date ?

Si vous ne connaissez pas l’ordre des valeurs min / max

 Date a, b; // assume these are set to something Date d; // the date in question return a.compareTo(d) * d.compareTo(b) > 0; 

Si vous souhaitez que la gamme soit inclusive

 return a.compareTo(d) * d.compareTo(b) >= 0; 

Cela pourrait être un peu plus lisible:

 Date min, max; // assume these are set to something Date d; // the date in question return d.after(min) && d.before(max); 

Ainsi:

 Date min, max; // assume these are set to something Date d; // the date in question return d.compareTo(min) >= 0 && d.compareTo(max) <= 0; 

Vous pouvez utiliser > au lieu de >= et < au lieu de <= pour exclure les points de terminaison du sens de "entre".

Voici quelques manières de le faire en utilisant la bibliothèque Joda-Time 2.3.

L’une des méthodes consiste à utiliser les méthodes isBefore et isAfter simples sur les instances DateTime . En passant, DateTime dans Joda-Time a un concept similaire à un java.util.Date (un moment dans la chronologie de l’univers) mais inclut un fuseau horaire.

Une autre méthode consiste à créer un intervalle dans Joda-Time. La méthode contains si une DateTime donnée est détectée dans l’intervalle de temps couvert par l’intervalle. Le début de l’intervalle est inclusif, mais le noeud final est exclusif. Cette approche est appelée “Half-Open”, symboliquement [) .

Voir les deux manières dans l’exemple de code suivant.

Convertissez les instances java.util.Date en instances Joda-Time DateTime . Passez simplement l’instance Date au constructeur de DateTime. En pratique, vous devez également passer un object DateTimeZone spécifique plutôt que de vous fier au fuseau horaire par défaut de JVM.

 DateTime dateTime1 = new DateTime( new java.util.Date() ).minusWeeks( 1 ); DateTime dateTime2 = new DateTime( new java.util.Date() ); DateTime dateTime3 = new DateTime( new java.util.Date() ).plusWeeks( 1 ); 

Comparez en testant avant / après…

 boolean is1After2 = dateTime1.isAfter( dateTime2 ); boolean is2Before3 = dateTime2.isBefore( dateTime3 ); boolean is2Between1And3 = ( ( dateTime2.isAfter( dateTime1 ) ) && ( dateTime2.isBefore( dateTime3 ) ) ); 

Utiliser l’approche par intervalles au lieu de isAfter / isBefore…

 Interval interval = new Interval( dateTime1, dateTime3 ); boolean intervalContainsDateTime2 = interval.contains( dateTime2 ); 

Vider pour consoler…

 System.out.println( "DateTimes: " + dateTime1 + " " + dateTime1 + " " + dateTime1 ); System.out.println( "is1After2 " + is1After2 ); System.out.println( "is2Before3 " + is2Before3 ); System.out.println( "is2Between1And3 " + is2Between1And3 ); System.out.println( "intervalContainsDateTime2 " + intervalContainsDateTime2 ); 

Quand courir…

 DateTimes: 2014-01-22T20:26:14.955-08:00 2014-01-22T20:26:14.955-08:00 2014-01-22T20:26:14.955-08:00 is1After2 false is2Before3 true is2Between1And3 true intervalContainsDateTime2 true 

Une autre option

 min.getTime() <= d.getTime() && d.getTime() <= max.getTime() 

Entre les dates Y compris les points finaux peut être écrit comme

 public static boolean isDateInBetweenIncludingEndPoints(final Date min, final Date max, final Date date){ return !(date.before(min) || date.after(max)); } 

Vous voudrez peut-être jeter un coup d’œil à Joda Time, qui est une très bonne API pour gérer la date et l’heure. Même si vous n’en avez pas vraiment besoin pour la solution de votre question actuelle, cela vous évitera certainement de souffrir dans le futur.

 import java.util.Date; public class IsDateBetween { public static void main (Ssortingng[] args) { IsDateBetween idb=new IsDateBetween("12/05/2010"); // passing your Date } public IsDateBetween(Ssortingng dd) { long from=Date.parse("01/01/2000"); // From some date long to=Date.parse("12/12/2010"); // To Some Date long check=Date.parse(dd); int x=0; if((check-from)>0 && (to-check)>0) { x=1; } System.out.println ("From Date is greater Than ToDate : "+x); } } 

vous pouvez utiliser getTime() et comparer les valeurs UTC longues renvoyées.

EDIT si vous êtes certain de ne pas avoir à traiter de dates antérieures à 1970, ne sachant pas comment cela se comportera dans ce cas.

Voici:

 public static void main(Ssortingng[] args) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); Ssortingng oeStartDateStr = "04/01/"; Ssortingng oeEndDateStr = "11/14/"; Calendar cal = Calendar.getInstance(); Integer year = cal.get(Calendar.YEAR); oeStartDateStr = oeStartDateStr.concat(year.toSsortingng()); oeEndDateStr = oeEndDateStr.concat(year.toSsortingng()); Date startDate = sdf.parse(oeStartDateStr); Date endDate = sdf.parse(oeEndDateStr); Date d = new Date(); Ssortingng currDt = sdf.format(d); if((d.after(startDate) && (d.before(endDate))) || (currDt.equals(sdf.format(startDate)) ||currDt.equals(sdf.format(endDate)))){ System.out.println("Date is between 1st april to 14th nov..."); } else{ System.out.println("Date is not between 1st april to 14th nov..."); } } 

Voici comment trouver si aujourd’hui est entre 2 mois:

 private boolean isTodayBetween(int from, int to) { if (from < 0 || to < 0 || from > Calendar.DECEMBER || to > Calendar.DECEMBER) { throw new IllegalArgumentException("Invalid month provided: from = " + from + " to = " + to); } Date now = new Date(); GregorianCalendar cal = new GregorianCalendar(); cal.setTime(now); int thisMonth = cal.get(Calendar.MONTH); if (from > to) { to = to + Calendar.DECEMBER; thisMonth = thisMonth + Calendar.DECEMBER; } if (thisMonth >= from && thisMonth <= to) { return true; } return false; } 

et l'appeler comme:

 isTodayBetween(Calendar.OCTOBER, Calendar.MARCH)