2

我想要定义部分日期/时间的对象,类似于 Unix crontabs 中的条目,即“任何一个月的第一天”等。

这些对象将与 Calendar 对象进行比较以查看它们是否匹配。

我正要编写自己的“TimePattern”类,但它必须包含很多逻辑,比如检查字段值是否在合法范围内(小时在 0 到 23 之间等),我觉得无论如何都会在类中,比如 Calendar。

所以,现在我只是使用一个(不宽松的)日历对象,其中一些字段未设置,我想将它们与代表固定时间点的完全设置的日历对象进行比较。我是不是该

  • 编写我自己的方法,通过相关字段并检查“相等或未设置”
  • 扩展(公历)日历类以包含“matchWith”方法
  • 使用一些已经存在的比较机制(在 Calendar 类中),但到目前为止我已经忽略了
4

5 回答 5

2

使用Quartz Cron Expression怎么样?

于 2009-03-05T15:39:54.167 回答
1

我过去使用的一种解决方案是编写一个 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()));
}

如果您要创建一个新库,这可能不是最好的实现,但它在其他情况下效果很好。

于 2009-03-05T15:50:03.630 回答
0

您可以创建一组比较器 - MinuteMatch、HourMatch 等,并使用它们来比较两个日期?

于 2009-03-05T15:37:30.227 回答
0

Google 的 RFC-2445会有用吗?这是一个日期重复计算器,可让您轻松执行“每三个月的第一个星期一”语义。

于 2009-03-05T16:24:23.593 回答
0

这就是我最终所做的:

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;
    }
}
于 2009-03-05T16:48:41.320 回答