[英]Java: how to use Date / Calendar
我正在为我的大学做一个小项目,该项目应招收学生参加不同的课程。 我确实有一个问题,每个课程都有开始/结束的入学日。 现在如何使用Date/Calendar
来避免必须使用自己的方法。 不过,我需要两个,一个是setDates()
,用于设置注册的开始日期和结束日期,第二个是isOpen()
,如果学生尝试过早或过早注册,它将返回错误。 (假设应用的时刻是程序运行的时刻,因此基本上是“现在”)
众所周知,JDK的Date和Calendar类缺乏功能和易用性。
我建议使用http://joda-time.sourceforge.net/中的Joda Date库使事情变得容易,但是据我所知,尚不存在可以完全满足您需求的库-我认为您是仍然需要自己写点东西。
听起来您好像在乎日期,而不是时间,所以请当心JDK Date类,其中包含日期和时间。 如果您不了解此情况,则在比较日期时可能会导致各种意外行为。 Joda可以提供帮助-例如,它具有一个LocalDate类,它表示“天”-一个没有时间的日期。
isOpen()
可以很简单:
public boolean isOpen() {
Date now = new Date();
return !now.before(startDate) && !now.after(endDate);
}
setDates()
可以只是一个简单的设置方法(尽管您应该保护结束日期不能早于开始日期的不变式)
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
类及其containsNow()
方法 )。
我将亲自扩展该类,然后创建自己的setStartDate(date startDate)setEndDate(date endDate)isOpen()
使用@mark peters'isopen并让该集合分配变量...
setDates-
public void setDates(Date start, Date end) {
this.start = start;
this.end = end;
}
开了 -
public boolean isOpen() {
Date now = new Date();
if(now.before(this.start) || now.after(this.end)) {
return false;
}
return true;
}
我假设您将使用某种日期选择器,将日期作为字符串返回。
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.
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.