我正在为我的大学做一个小项目,该项目应该让学生参加不同的课程。我确实有一个问题,每个课程都有开始/结束登记日。我现在如何使用Date/Calendar
来避免必须使用我自己的方法。我需要两个,一个是setDates()
,用于设置注册的开始和结束日期,第二个是isOpen()
,如果学生尝试过早或过晚注册,将返回错误。 (假设应用的时刻是程序运行的时刻,所以基本上是“现在”)
答案 0 :(得分:3)
众所周知,JDK的日期和日历类在功能和易用性方面都缺乏。
我建议使用http://joda-time.sourceforge.net/中的Joda Date库来简化操作,但据我所知,没有现有的库可以完全满足您的需求 - 我认为您仍然会有自己写点东西。
听起来你关心日期,但不关心时间,所以要注意JDK Date类,它包含日期和时间。如果您不了解这一点,这可能会在比较日期时导致各种意外行为。 Joda可以提供帮助 - 例如,它有一个代表“日期”的LocalDate类 - 一个没有时间的日期。
答案 1 :(得分:2)
isOpen()
可以这么简单:
public boolean isOpen() {
Date now = new Date();
return !now.before(startDate) && !now.after(endDate);
}
setDates()
可以只是一个简单的setter(虽然你应该保护结束日期不能在开始日期之前的不变量)
private Date startDate, endDate;
public void setDates(Date startDate, Date endDate) {
Date startCopy = new Date(startDate);
Date endCopy = new Date(endDate);
if ( startCopy.after(endCopy) ) {
throw new IllegalArgumentException("start must not be after end");
}
this.startDate = startCopy;
this.endDate = endCopy;
}
这种类型的逻辑非常常见,第三方Joda-Time库可以很好地为您封装它(例如通过Interval
class及其containsNow()
method)。
答案 2 :(得分:1)
我个人会扩展课程然后自己创作 setStartDate(date startDate) setEndDate(date endDate) ISOPEN()
使用@mark peters'isopen,只需设置分配变量......
答案 3 :(得分:1)
setDates -
public void setDates(Date start, Date end) {
this.start = start;
this.end = end;
}
isOpen -
public boolean isOpen() {
Date now = new Date();
if(now.before(this.start) || now.after(this.end)) {
return false;
}
return true;
}
答案 4 :(得分:1)
我假设您将使用某种日期选择器将日期作为字符串返回。
setDates将需要这个:
isOpen更容易。
以下是一些代码:
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import org.apache.commons.lang3.StringUtils;
/**
* @author David W. Burhans
*
*/
public final class Registration
{
private static final DateFormat dateFormat = new SimpleDateFormat("dd MMM yyyy");
private static Date endDate;
private static Date startDate;
private static boolean isOpen()
{
Date now = new Date();
boolean returnValue;
if (now.before(startDate) || now.after(endDate))
{
returnValue = false;
}
else
{
returnValue = true;
}
return returnValue;
}
/**
* @param args
*/
public static void main(String[] args)
{
setDates("21 Jan 2012", "28 Jan 2012");
System.out.print("Start Date: ");
System.out.println(startDate);
System.out.print("End Date: ");
System.out.println(endDate);
System.out.print("Is today in range: ");
System.out.println(isOpen());
}
private static void setDates(final String startDateString, final String endDateString)
{
// All or nothing.
if (StringUtils.isNotBlank(startDateString) && StringUtils.isNotBlank(endDateString))
{
Calendar calendar = Calendar.getInstance();
Date workingDate;
try
{
workingDate = dateFormat.parse(endDateString);
calendar.setTime(workingDate);
calendar.set(Calendar.HOUR, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
endDate = calendar.getTime();
}
catch (ParseException exception)
{
//System.out.println("endDate parse Exception");
// log that endDate is invalid. throw exception.
}
try
{
workingDate = dateFormat.parse(startDateString);
calendar.setTime(workingDate);
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
startDate = calendar.getTime();
}
catch (ParseException exception)
{
//System.out.println("startDate parse Exception");
// log that startDate is invalid. throw exception.
}
}
else
{
// throw exception indicating which is bad.
}
}
}