2009-05-19 1 views

Antwort

90

Wenn Sie nicht die Reihenfolge der min kennen/Max-Werte

Date a, b; // assume these are set to something 
Date d;  // the date in question 

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

Wenn Sie den Bereich wollen einschließend sein

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

Works, aber nicht lesbar. Danke trotzdem. –

+1

@BrunoDeFreitasBarros Was meinst du mit "nicht lesbar"? –

+1

@Peter Lawrey Bruno bedeutet, dass es schwer ist, Code ohne Kommentar zu verstehen. – Mirimas

36

Wie so:

Date min, max; // assume these are set to something 
Date d;   // the date in question 

return d.compareTo(min) >= 0 && d.compareTo(max) <= 0; 

Sie können > anstelle von >= und < statt <= auf die Endpunkte von dem Sinne ausschließen „dazwischen.“ Dies könnte ein bisschen besser lesbar sein

+0

Vielen Dank für Ihre sofortige Antwort. –

+1

Dies funktioniert nicht immer. Ich hatte Probleme mit compareTo on Date-Objekten. Der 1. Januar 2006 war anscheinend nach dem 1. April 2006 in einem meiner Programme. – KitsuneYMG

+0

@KitsuneYMG: Ich habe den folgenden Code versucht und funktioniert wie erwartet: 'Date date1 = new Date (2006, 1, 1); // Jan 1.2006 Datum date2 = neues Datum (2006, 4, 1); // 01.04.2006 System.out.println (date1.compareTo (date2)); // -1 System.out.println (date2.compareTo (date1)); // 1'. Können Sie hier teilen, was ist das * nicht funktioniert * für Sie? – Gnanam

212

:

Date min, max; // assume these are set to something 
Date d;   // the date in question 

return d.after(min) && d.before(max); 
+1

Eine sehr gesunde 9 Sekunden schneller, Herr. –

+42

dazwischen können die Endpunkte enthalten, in diesem Fall könnten Sie return! D.before (min) &&! D.after (max); –

+1

@Tetsujin nein Oni Entschuldigung Mann, es ist eine gute Sache, ich habe keine große Lieferung fällig in ein paar Wochen, die sowohl von SO geholfen als auch verletzt wird. :) –

2

Sie getTime() und vergleichen Sie die zurück lange UTC Werte verwenden können.

BEARBEITEN, wenn Sie sicher sind, dass Sie nicht mit Daten vor 1970 beschäftigen müssen, nicht sicher, wie es sich in diesem Fall verhalten wird.

8

Eine weitere Option

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

Sie vielleicht einen Blick auf Joda Time nehmen wollen, die für den Umgang mit Datum/Zeit eine wirklich gute API ist. Auch wenn Sie es für die Lösung Ihrer aktuellen Frage nicht wirklich brauchen, wird es Ihnen in Zukunft sicher Schmerzen ersparen.

+1

Ja, mein erster Gedanke war, Joda-Zeit vorzuschlagen, aber ich kann nichts in der API sehen, um einen Test "innerhalb der Reichweite" zu unterstützen. Irgendjemand anderes? – dukedave

+1

Ich schlage Joda für dieses spezielle Problem nicht vor, da es bereits zahlreiche Lösungen hat. – willcodejavaforfood

+1

Aber Sie würden ein Intervall in Joda Time erstellen, um dies zu tun – willcodejavaforfood

2
import java.util.Date; 

public class IsDateBetween { 

public static void main (String[] args) { 

      IsDateBetween idb=new IsDateBetween("12/05/2010"); // passing your Date 
} 
public IsDateBetween(String 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); 
} 

} 
+1

Das ist schöner Code, das ist vielleicht eine der besten Funktionen, die ich je gesehen habe. Es hat mir sehr geholfen. Vielen Dank! – Bassiuz

1

Hier gehen Sie:

public static void main(String[] args) throws ParseException { 

     SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); 

     String oeStartDateStr = "04/01/"; 
     String oeEndDateStr = "11/14/"; 

     Calendar cal = Calendar.getInstance(); 
     Integer year = cal.get(Calendar.YEAR); 

     oeStartDateStr = oeStartDateStr.concat(year.toString()); 
     oeEndDateStr = oeEndDateStr.concat(year.toString()); 

     Date startDate = sdf.parse(oeStartDateStr); 
     Date endDate = sdf.parse(oeEndDateStr); 
     Date d = new Date(); 
     String 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..."); 
     } 
    } 
10

Hier sind ein paar Möglichkeiten, dies mit derzu tun2.3 Bibliothek.

Eine Möglichkeit besteht darin, die einfachen Methoden und isAfter auf DateTime Instanzen zu verwenden. Übrigens, DateTime in Joda-Time ist im Konzept ähnlich zu einem java.util.Date (ein Zeitpunkt auf der Zeitachse des Universums), enthält aber eine Zeitzone.

Eine andere Möglichkeit besteht darin, ein Intervall in Joda-Time zu erstellen. Die contains-Methode testet, ob eine bestimmte DateTime innerhalb der durch das Interval abgedeckten Zeitspanne auftritt. Der Anfang des Intervalls ist inklusive, der Endpunkt ist jedoch exklusiv. Dieser Ansatz wird als "halboffen" bezeichnet, symbolisch [).

Im folgenden Codebeispiel finden Sie beide Möglichkeiten.

Konvertieren Sie die Instanzen java.util.Date in Joda-Time Instanzen. Übergeben Sie die Date-Instanz einfach an den Konstruktor von DateTime. In der Praxis sollten Sie auch ein bestimmtes Objekt DateTimeZone übergeben, anstatt sich auf die Standardzeitzone von JVM zu verlassen.statt isAfter/isBefore ...

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

Dump zu trösten ...

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

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

von Testvergleich vor/nach ...

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

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

den Ansatz Interval Mit

Wenn ...

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 
2

Hier ist, wie zu erfahren, ob heute von 2 Monaten ist:

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; 
} 

und nennen es mag:

isTodayBetween(Calendar.OCTOBER, Calendar.MARCH) 
1

Zwischen Terminen inklusive Endpunkte als

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