Java:如何使用日期/日历
我正在为我的大学做一个小项目,该项目旨在招收不同课程的学生。但我有一个问题,每门课程都有开始/结束注册日。我现在如何使用日期/日历来避免创建自己的方法。不过我需要两个,一个是setDates,用于设置注册的开始和结束日期,第二个是isOpen,如果学生尝试注册太早或太迟,它将返回错误。假设应用的时刻是程序运行的时刻,那么现在基本上isOpen可以这么简单:Java:如何使用日期/日历,java,date,calendar,Java,Date,Calendar,我正在为我的大学做一个小项目,该项目旨在招收不同课程的学生。但我有一个问题,每门课程都有开始/结束注册日。我现在如何使用日期/日历来避免创建自己的方法。不过我需要两个,一个是setDates,用于设置注册的开始和结束日期,第二个是isOpen,如果学生尝试注册太早或太迟,它将返回错误。假设应用的时刻是程序运行的时刻,那么现在基本上isOpen可以这么简单: public boolean isOpen() { Date now = new Date(); return !now.b
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 library可以很好地为您封装它,例如,通过及其。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 library可以很好地为您封装它,例如通过和。众所周知,JDK的Date和Calendar类在功能性和易用性方面都非常缺乏 我建议从开始使用Joda Date库来简化工作,但据我所知,目前还没有一个库能够完全满足您的需求——我认为您仍然需要自己编写一些东西
听起来您关心的是日期,而不是时间,所以请注意JDK Date类,它包含了日期和时间。如果您没有意识到这一点,那么在比较日期时,这可能会导致各种意外行为。Joda可以提供帮助——例如,它有一个LocalDate类,它表示一个“天”——一个没有时间的日期。众所周知,JDK的日期和日历类在功能性和易用性方面都存在缺陷 我建议从开始使用Joda Date库来简化工作,但据我所知,目前还没有一个库能够完全满足您的需求——我认为您仍然需要自己编写一些东西
听起来您关心的是日期,而不是时间,所以请注意JDK Date类,它包含了日期和时间。如果您没有意识到这一点,那么在比较日期时,这可能会导致各种意外行为。Joda可以提供帮助——例如,它有一个LocalDate类,它表示一个“天”——一个没有时间的日期。我个人会扩展这个类,然后创建自己的类 设置开始日期开始日期 setEndDate结束日期 等参
使用@mark-peters'isopen,让集合分配变量…我个人会扩展这个类,然后创建自己的类 设置开始日期开始日期 setEndDate结束日期 等参 使用@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;
}
设定日期-
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;
}
我假设您将使用某种日期选择器,以字符串形式返回日期 设置日期需要: 两个字符串参数;开始日期和结束日期。 参数SimpleDataFormat的解析。 关于选择器返回的日期格式的知识我将假定为DD MON YYYY,例如:2011年10月12日 存储日期的两个日期对象:开始日期和结束日期。 使用日历清除日期小时、分钟、秒和毫秒中不需要的部分。 将结束日期调整为11:59 p。 伊索彭更容易 验证startDate和endDate是否不为null。 获取当前日期新日期。 检查是否超出范围。 下面是一些代码:
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.
}
}
}
我假设您将使用某种日期选择器,以字符串形式返回日期 设置日期需要: 两个字符串参数;开始日期和结束日期。 参数SimpleDataFormat的解析。 关于选择器返回的日期格式的知识我将假定为DD MON YYYY,例如:2011年10月12日 存储日期的两个日期对象:开始日期和结束日期。 使用日历清除日期小时、分钟、秒和毫秒中不需要的部分。 将结束日期调整为11:59 p。 伊索彭更容易 验证startDate和endDate是否不为null。 获取当前日期新日期。 检查是否超出范围。 下面是一些代码:
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.
}
}
}
你可能需要问一个关于它们用法的更具体的问题;日期或日历课程会让你感到困惑吗?它们只是用来创建日期,可以从你自己的应用程序特定的方法调用;日期或日历课程会让你感到困惑吗?它们只是用来创建日期,并且可以从您自己的应用程序特定的方法调用。谢谢,这似乎足够了。不幸的是,我不能使用第三方库。我们做的所有项目都必须在大学服务器上测试。。。还有一件事。设置t时可以使用什么格式
他手工约会。类似于:newDatedd/MM/yyyy?将开始日期调整为0小时、分钟、秒、毫秒。将结束日期调整为23小时59分59秒999毫秒。谢谢,这似乎足够了。不幸的是,我不能使用第三方库。我们做的所有项目都必须在大学服务器上测试。。。还有一件事。手动设置日期时可以使用什么格式。类似于:newDatedd/MM/yyyy?将开始日期调整为0小时、分钟、秒、毫秒。将结束日期调整为23小时59分59秒999毫秒。