Как проверить, существует ли дата между двумя другими датами, в случае, когда все три даты представлены экземплярами java.util.Date
?
Как определить, существует ли дата между двумя датами в Java?
Ответ 1
Если вы не знаете порядок значений 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;
Если вы хотите, чтобы диапазон был включен
return a.compareTo(d) * d.compareTo(b) >= 0;
Ответ 2
Это может быть немного более читаемым:
Date min, max; // assume these are set to something
Date d; // the date in question
return d.after(min) && d.before(max);
Ответ 3
Так же:
Date min, max; // assume these are set to something
Date d; // the date in question
return d.compareTo(min) >= 0 && d.compareTo(max) <= 0;
Вы можете использовать >
вместо >=
и <
вместо <=
, чтобы исключить конечные точки из значения "между".
Ответ 4
Вот несколько способов сделать это, используя библиотеку Joda-Time 2.3.
Один из способов - использовать простые методы isBefore
и isAfter
для экземпляров DateTime. Кстати, DateTime в Joda-Time похож на концепцию java.util.Date(момент времени на временной шкале Вселенной), но включает часовой пояс.
Другой способ - создать интервал в Joda-Time. Метод contains
проверяет, существует ли заданный период времени в течение промежутка времени, охватываемого Интервалом. Начало Интервала включено, но конечная точка является исключительной. Этот подход известен как "Полуоткрытый", символически [)
.
См. оба варианта в следующем примере кода.
Преобразуйте экземпляры java.util.Date в экземпляры Joda-Time DateTime
. Просто передайте экземпляр Date в конструктор DateTime. На практике вы также должны передать конкретный DateTimeZone
объект, а не полагаться на часовой пояс 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 );
Сравните путем тестирования до/после...
boolean is1After2 = dateTime1.isAfter( dateTime2 );
boolean is2Before3 = dateTime2.isBefore( dateTime3 );
boolean is2Between1And3 = ( ( dateTime2.isAfter( dateTime1 ) ) && ( dateTime2.isBefore( dateTime3 ) ) );
Использование подхода Интервал вместо isAfter/isBefore...
Interval interval = new Interval( dateTime1, dateTime3 );
boolean intervalContainsDateTime2 = interval.contains( dateTime2 );
Дамп для консоли...
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 );
При запуске...
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
Ответ 5
Другой вариант
min.getTime() <= d.getTime() && d.getTime() <= max.getTime()
Ответ 6
вы можете использовать getTime()
и сравнить возвращаемые длинные значения UTC.
ИЗМЕНИТЬ, если вы уверены, что вам не придется иметь дело с датами до 1970 года, не уверен, как он будет вести себя в этом случае.
Ответ 7
Вы можете взглянуть на Joda Time, который является действительно хорошим API для работы с датой/временем. Даже если вам это действительно не нужно для решения вашего текущего вопроса, он обязательно спасет вас от боли в будущем.
Ответ 8
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);
}
}
Ответ 9
Здесь, как найти, находится ли между двумя месяцами:
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;
}
и назовите его так:
isTodayBetween(Calendar.OCTOBER, Calendar.MARCH)
Ответ 10
Здесь вы идете:
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...");
}
}
Ответ 11
Между датами Включение конечных точек может быть записано как
public static boolean isDateInBetweenIncludingEndPoints(final Date min, final Date max, final Date date){
return !(date.before(min) || date.after(max));
}