Java:如何使用日期/日历

时间:2011-10-17 13:13:40

标签: java date calendar

我正在为我的大学做一个小项目,该项目应该让学生参加不同的课程。我确实有一个问题,每个课程都有开始/结束登记日。我现在如何使用Date/Calendar来避免必须使用我自己的方法。我需要两个,一个是setDates(),用于设置注册的开始和结束日期,第二个是isOpen(),如果学生尝试过早或过晚注册,将返回错误。 (假设应用的时刻是程序运行的时刻,所以基本上是“现在”)

5 个答案:

答案 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将需要这个:

  • 两个字符串参数;开始日期和结束日期。
  • 解析参数(SimpleDateFormat)。
  • 知道选择器返回的日期格式(我假设DD MON YYYY,例如:“2011年10月12日”)
  • 两个Date对象,用于存储日期:开始日期和结束日期。
  • 使用日历清除日期中不需要的部分(小时,分钟,秒和毫秒)。
  • 将结束日期调整为11:59p。

isOpen更容易。

  • 验证startDate和endDate不为空。
  • 获取当前日期(新日期())。
  • 检查它是否在范围之外。

以下是一些代码:

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.
        }
    }
}