Как я могу определить, если дата находится между двумя датами в Java? [дубликат]



этот вопрос уже есть ответ здесь:




  • Java: как проверить, находится ли дата в определенном диапазоне?

    11 ответов



Как я могу проверить, если дата находится между двумя другими датами, в том случае, когда все три даты представлены экземплярами java.util.Date?

1069   11  

11 ответов:

Если вы не знаете порядок значений 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;

Это может быть немного более читаемым:

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

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

вот так:

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

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

можно использовать > вместо >= и < вместо <= чтобы исключить конечные точки из смысла "между"."

вот несколько способов сделать это с помощью Joda Времени 2.3 библиотека.

один из способов-использовать простой isBefore и isAfter методы DateTime экземпляров. Кстати, DateTime в Joda-Time схож по концепции с java.утиль.Дата (момент времени на временной шкале Вселенной), но включает в себя часовой пояс.

другой способ-построить интервал в Джода-времени. Элемент contains метод проверяет, если данная дата и время происходит в пределах промежуток времени, охватываемый интервалом. Начало интервала является включительным, но конечная точка является исключительной. Этот подход известен как "полуоткрытый", символически [).

см. оба способа в следующем примере кода.

преобразование java.утиль.Экземпляры даты в Joda-Time DateTime экземпляров. Просто передайте дата экземпляр в конструктор типа 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

другой вариант

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

между датами, включая конечные точки, можно записать как

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

возможно, вы захотите взглянуть на Джода Времени который является действительно хорошим API для работы с датой / временем. Даже если вам это действительно не нужно для решения вашего текущего вопроса, это обязательно спасет вас от боли в будущем.

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

}

можно использовать getTime() и сравнение полученного значения большого мирового.

редактировать если вы уверены, что вам не придется иметь дело с датами до 1970 года, не уверен, как он будет вести себя в этом случае.

вот так:

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...");
        }
    }

вот как узнать, находится ли сегодня между 2 месяцами:

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)

Comments

    Ничего не найдено.