Java:如何使用日期/日历

Java:如何使用日期/日历,java,date,calendar,Java,Date,Calendar,我正在为我的大学做一个小项目,该项目旨在招收不同课程的学生。但我有一个问题,每门课程都有开始/结束注册日。我现在如何使用日期/日历来避免创建自己的方法。不过我需要两个,一个是setDates,用于设置注册的开始和结束日期,第二个是isOpen,如果学生尝试注册太早或太迟,它将返回错误。假设应用的时刻是程序运行的时刻,那么现在基本上isOpen可以这么简单: public boolean isOpen() { Date now = new Date(); return !now.b

我正在为我的大学做一个小项目,该项目旨在招收不同课程的学生。但我有一个问题,每门课程都有开始/结束注册日。我现在如何使用日期/日历来避免创建自己的方法。不过我需要两个,一个是setDates,用于设置注册的开始和结束日期,第二个是isOpen,如果学生尝试注册太早或太迟,它将返回错误。假设应用的时刻是程序运行的时刻,那么现在基本上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可以很好地为您封装它,例如,通过及其。

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毫秒。