Сопоставить объекты календаря в Java? - PullRequest
2 голосов
/ 05 марта 2009

Я хочу иметь объекты, которые определяют частичные даты / время, подобные записям в crontabs Unix, т.е. е. "каждый первый день любого месяца" и т. д.

Эти объекты будут сравниваться с объектами календаря, чтобы определить, совпадают ли они.

Я собирался написать свой собственный класс "TimePattern", но он должен был бы содержать много логики, например, проверять, находились ли значения полей внутри допустимых границ (час между 0 и 23 и т. Д.), Которые, по моему мнению, были бы внутри классов, таких как Календарь в любом случае.

Итак, теперь я просто использую (не являющийся объектом) объект Calendar с некоторыми неустановленными полями и хочу сравнить их с полностью установленными объектами Calendar, которые представляют фиксированный момент времени. Должен ли я

  • написать свой собственный метод, который проходит через соответствующие поля и проверяет "равно или не установлено"
  • расширить класс григорианского календаря, добавив в него метод matchWith
  • использовать некоторый механизм сравнения, который уже есть (в классе Calendar), но который я пока упустил

Ответы [ 5 ]

2 голосов
/ 05 марта 2009

Как насчет использования Кварцевого выражения Cron ?

1 голос
/ 05 марта 2009

Одним из решений, которое я использовал в прошлом, является написание DateFormat, который будет форматировать даты только с теми полями, которые вы хотите, а затем сравнивать полученные строки. Например, довольно часто не заботиться о компоненте времени, только о датах, поэтому вы можете сделать что-то вроде этого:

public boolean sameDate(Calendar c1, Calendar c2)
{
    DateFormat datesOnly = new SimpleDateFormat("yyyy-MM-dd");
    return datesOnly.format(c1.getTime()).equals(datesOnly.format(c2.getTime()));
}

Вероятно, это не лучшая реализация, если вы собираетесь создать новую библиотеку, но она хорошо работает в других случаях.

0 голосов
/ 05 марта 2009

Вот что я в итоге сделал:

public class CalendarMatch<T extends Calendar> {
    private T _dt;

    public CalendarMatch(T dt) {
        this._dt = dt;
    }

    public boolean fMatches(T dtCmp)
    {
        int[] rgChecks = {
                           Calendar.HOUR_OF_DAY,
                           Calendar.MINUTE,
                           Calendar.SECOND,
                           Calendar.DAY_OF_MONTH,
                           Calendar.MONTH,
                           Calendar.YEAR,
                           Calendar.DAY_OF_WEEK
                         };
        for (int ixField : rgChecks) {
            // if any field in our partial date is set
            // but does not equal its counterpart, it's not a match
            if (this._dt.isSet(ixField) && dtCmp.get(ixField) != this._dt.get(ixField)) {
                return false;
            }
        }
        // otherwise, it is
        return true;
    }
}
0 голосов
/ 05 марта 2009

Будет ли Google RFC-2445 иметь какое-либо применение? Это калькулятор повторения дат, который позволяет легко выполнять семантику «первый понедельник каждого третьего месяца».

0 голосов
/ 05 марта 2009

Вы можете создать набор компараторов - MinuteMatch, HourMatch и т. Д. И использовать их для сравнения двух дат?

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