繁体   English   中英

Java:如何使用日期/日历

[英]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将需要以下内容:

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

isOpen更容易。

  • 验证startDate和endDate不为null。
  • 获取当前日期(新的Date())。
  • 检查它是否超出范围。

这是一些代码:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM