Проверить дату между двумя датами в Java

Одна вещь, которую я хочу знать, - это рассчитать, какая дата будет 10 дней с сегодняшнего дня.

Во-вторых, нужно проверить, существует ли одна дата между двумя другими датами. Например, скажем, у меня есть приложение, которое показывает, какие события мне нужно делать в ближайшие 10 дней (планировщик). Теперь, как я могу увидеть, назначена ли дата, назначенная событию, между сегодняшним днем ​​и датой, которая составляет 10 дней с сегодняшнего дня?

Ответы

Ответ 1

Манипулирование и сравнение дат с использованием java.util.Date и java.util.Calendar - довольно боль, поэтому JodaTime существует. Ни один из ответов не затронул вопрос время. Сравнение может завершиться неудачей, если даты имеют ненулевое время. Также неясно, хотите ли вы инклюзивного или эксклюзивного сравнения. Большинство ответов, опубликованных до сих пор, предлагают эксклюзивное сравнение (т.е. 24 мая не) с 20 мая по 24 мая), в то время как в реальности было бы более целесообразно сделать его включительным (т.е. 24 мая с 20 мая по 24 мая).


Одна вещь, которую я хочу знать, - это рассчитать, какая дата будет 10 дней с сегодняшнего дня.

В стандартном Java SE 6 API вам нужно java.util.Calendar.

Calendar plus10days = Calendar.getInstance();
plus10days.add(Calendar.DAY_OF_YEAR, 10);

С JodaTime вы бы сделали следующее:

DateTime plus10days = new DateTime().plusDays(10);

Во-вторых, нужно проверить, существует ли одна дата между двумя другими датами. Например, скажем, у меня есть приложение, которое показывает, какие события мне нужно делать в ближайшие 10 дней (планировщик). Теперь, как я могу увидеть, назначена ли дата, назначенная событию, между сегодняшним днем ​​и датой, которая составляет 10 дней с сегодняшнего дня?

Теперь идет ужасная часть с Calendar. Пусть сначала подготовьтесь:

Calendar now = Calendar.getInstance();
Calendar plus10days = Calendar.getInstance();
plus10days.add(Calendar.DAY_OF_YEAR, 10);
Calendar event = Calendar.getInstance();
event.set(year, month - 1, day); // Or setTime(date);

Для надежного сравнения с использованием Calendar#before() и Calendar#after() нам нужно сначала избавиться от времени. Представьте себе, что в настоящее время 24 мая 2010 года в 9.00 и что дата события установлена ​​24 мая 2010 года без времени. Если вы хотите включить инклюзивное сравнение, вы хотели бы сделать его return true в тот же день. То есть как (event.equals(now) || event.after(now)), так и -shorter, но равно - (!event.before(now)) должны возвращать true. Но на самом деле этого не происходит из-за присутствия времени в now. Вам нужно очистить время во всех календарных экземплярах, как показано ниже:

calendar.clear(Calendar.HOUR);
calendar.clear(Calendar.HOUR_OF_DAY);
calendar.clear(Calendar.MINUTE);
calendar.clear(Calendar.SECOND);
calendar.clear(Calendar.MILLISECOND);

В качестве альтернативы вы также можете сравнивать только день/месяц/год.

if (event.get(Calendar.YEAR) >= now.get(Calendar.YEAR)
    && event.get(Calendar.MONTH) >= now.get(Calendar.MONTH)
    && event.get(Calendar.DAY_OF_MONTH) >= now.get(Calendar.DAY_OF_MONTH)
{
    // event is equal or after today.
}

Очень много подробностей.

С JodaTime вы можете просто использовать DateTime#toLocalDate(), чтобы получить только часть даты:

LocalDate now = new DateTime().toLocalDate();
LocalDate plus10days = now.plusDays(10);
LocalDate event = new DateTime(year, month, day, 0, 0, 0, 0).toLocalDate();
if (!event.isBefore(now) && !event.isAfter(plus10days)) {
    // Event is between now and 10 days (inclusive).
}

Да, это действительно все, что вам нужно сделать.

Ответ 2

public static boolean between(Date date, Date dateStart, Date dateEnd) {
    if (date != null && dateStart != null && dateEnd != null) {
        if (date.after(dateStart) && date.before(dateEnd)) {
            return true;
        }
        else {
            return false;
        }
    }
    return false;
}

EDIT: другой предложенный вариант:

public Boolean checkDate(Date startDate, Date endDate, Date checkDate) { 
    Interval interval = new Interval(new DateTime(startDate), 
                                     new DateTime(endDate));   
    return interval.contains(new DateTime(checkDate)); 
}

Ответ 5

Чтобы добавить десять дней:

Date today = new Date();
Calendar cal = new GregorianCalendar();
cal.setTime(today);
cal.add(Calendar.DAY_OF_YEAR, 10);

Чтобы проверить, существует ли между двумя датами:

myDate.after(firstDate) && myDate.before(lastDate);

Ответ 6

Ниже вы найдете ответы

Ответ 7

Я взял первоначальный ответ и немного изменил его. Я считаю, что даты равны "внутри".

private static boolean between(Date date, Date dateStart, Date dateEnd) {
    if (date != null && dateStart != null && dateEnd != null) {
        return (dateEqualOrAfter(date, dateStart) && dateEqualOrBefore(date, dateEnd));

    }
    return false;
}

private static boolean dateEqualOrAfter(Date dateInQuestion, Date date2)
{
    if (dateInQuestion.equals(date2))
        return true;

    return (dateInQuestion.after(date2));

}
private static boolean dateEqualOrBefore(Date dateInQuestion, Date date2)
{
    if (dateInQuestion.equals(date2))
        return true;

    return (dateInQuestion.before(date2));

}

Ответ 8

Чтобы проверить, существует ли дата между двумя датами, вот простая программа:

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