манипулируя и сравнение дат с использованием 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).
}
Да, выше действительно все вам нужно сделать.
+1 Особенно если вы делаете обычную дату (не datetime), класс LocalDate от JodaTime дает вам все, что вам нужно. – leonbloy