我想知道的第一件事是如何计算从今天开始10天后的日期。
第二件事是检查一个日期是否在另外两个日期之间。 例如,假设我有一个应用程序,显示我在接下来的10天内需要完成的事件(日程安排)。现在我如何判断我分配给某个事件的日期是否在今天和从今天开始10天后的日期之间?
使用java.util.Date
和java.util.Calendar
操作和比较日期会很麻烦,这就是为什么存在JodaTime。迄今为止,没有任何答案涵盖了所需的时间。当日期具有非零时间时,比较可能会失败。而且不清楚您是否需要进行包含或排除比较。到目前为止,大多数答案建议进行排除比较(即5月24日在5月20日和5月24日之间不),而实际上,将其更改为包含比较(即5月24日在5月20日和5月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()
进行比较,我们需要先去除时间。假设现在是2010年5月24日上午9点,并且事件的日期已经设置为没有时间的2010年5月24日。当你想进行包容性比较时,你希望在同一天使其return true
。也就是说,(event.equals(now) || event.after(now))
或者更短但是等价的 (!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).
}
是的,以上内容确实是您需要做的全部。
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;
}
编辑:另一种建议的变体:
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));
}
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
此外,以下是关于 Date 类的 API: 祝你好运!如果需要加上十天:
Date today = new Date();
Calendar cal = new GregorianCalendar();
cal.setTime(today);
cal.add(Calendar.DAY_OF_YEAR, 10);
检查是否在两个日期之间:
myDate.after(firstDate) && myDate.before(lastDate);
要检查日期是否在两个日期之间,这里是一个简单的程序:
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...");
}
}
我采用了最初的答案并进行了一些修改。如果日期相等,则认为它们是“内部的”。
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));
}