Java: как использовать дату / календарь - PullRequest
1 голос
/ 17 октября 2011

Я делаю небольшой проект для своего университета, который должен зачислять студентов на разные курсы.У меня есть одна проблема, хотя у каждого курса есть день начала / окончания регистрации.Как теперь я могу использовать Date/Calendar, чтобы избежать необходимости создавать собственный метод.Мне понадобятся две, хотя одна: setDates(), используется для установки даты начала и окончания зачисления, а вторая - isOpen(), которая выдаст ошибку, если студент попытается поступить слишком рано или слишком поздно.(Предполагается, что моментом применения является момент запуска программы, поэтому в основном «сейчас»)

Ответы [ 5 ]

3 голосов
/ 17 октября 2011

Классы JDK Date и Calendar, как известно, не обладают ни функциональностью, ни простотой использования.

Я бы предложил использовать библиотеку Joda Date из http://joda -time.sourceforge.net / , чтобы упростить задачу, но, насколько я знаю, не существует библиотеки, которая быточно соответствует вашим потребностям - я думаю, что вам все равно придется что-то писать самостоятельно.

Похоже, вы заботитесь о датах, а не о времени, поэтому остерегайтесь класса JDK Date, который включает дату и время.Это может привести к неожиданному поведению при сравнении дат, если вы не знаете об этом.Joda может помочь - у него есть, например, класс LocalDate, который представляет «день» - дату без времени.

2 голосов
/ 17 октября 2011

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() метод ).

1 голос
/ 17 октября 2011

Полагаю, вы будете использовать какой-то инструмент выбора даты, который возвращает дату в виде строки.

setDates потребует этого:

  • Два параметра String; дата начала и окончания.
  • Разбор параметров (SimpleDateFormat).
  • Знание формата даты, который возвращается сборщиком (я буду считать ДД МЕС ГГГГ, например: "12 октября 2011")
  • Два объекта 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.
        }
    }
}
1 голос
/ 17 октября 2011

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;
}
1 голос
/ 17 октября 2011

Я лично расширил бы класс, а затем сделал бы свой собственный setStartDate (date startDate) setEndDate (date endDate) isOpen ()

Использовал isopen @mark peters 'и просто заставлял набор назначать переменные ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...