2010-05-24 3 views
14

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

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

ответ

5

Используйте JodaTime классов календаря замена: http://joda-time.sourceforge.net/

+0

+1 Особенно если вы делаете обычную дату (не datetime), класс LocalDate от JodaTime дает вам все, что вам нужно. – leonbloy

3

Вы можете использовать перед, после и CompareTo методов Даты класса.

Here're некоторые примеры

http://www.roseindia.net/java/example/java/util/CompareDate.shtml

http://www.javafaq.nu/java-example-code-287.html

http://www.esus.com/javaindex/j2se/jdk1.2/javautil/dates/comparingdates.html

И вот API на Дата класса

http://java.sun.com/j2se/1.4.2/docs/api/java/util/Date.html

Удачи!

2

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

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

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

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

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


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

Для стандартного API Java SE 6 вам необходимо 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). 
} 

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

13
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)); 
} 
+0

это использует JodaTime, не так ли? – hotzen

+0

, и это массивный NULL-контрольный пример анти-шаблона :) – hotzen

0

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

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

} 
0

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

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..."); 
    } 
} 
Смежные вопросы