Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中匹配日历对象?_Java_Calendar - Fatal编程技术网

在Java中匹配日历对象?

在Java中匹配日历对象?,java,calendar,Java,Calendar,我想让定义部分日期/时间的对象类似于Unix crontab中的条目,即。E“任何月份的第一天”等 将这些对象与日历对象进行比较,以查看它们是否匹配 我正要写我自己的“TimePattern”类,但它必须包含很多逻辑,比如检查字段值是否在合法范围内(0到23之间的小时数等),我觉得无论如何都会在Calendar之类的类中 所以,现在我只使用一个(非宽容的)日历对象,其中一些字段未设置,我想将它们与表示固定时间点的完全设置的日历对象进行比较。我应该吗 编写我自己的方法,遍历相关字段并检查“等于或

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

将这些对象与日历对象进行比较,以查看它们是否匹配

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

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

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

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

如何使用?

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

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

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

这就是我最终所做的:

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;
    }
}
公共类日历匹配{
私人T_dt;
公共日历匹配(T dt){
这个。_dt=dt;
}
公共布尔匹配(T dtCmp)
{
int[]rgChecks={
日历。每天的小时数,
日历。分钟,
日历第二,
日历。月的第天,
日历月,
日历年,
日历。星期的第天
};
for(int ixField:rgChecks){
//如果设置了部分日期中的任何字段
//但不等于它的对应物,这不是一个匹配
if(this._dt.isSet(ixField)&dtCmp.get(ixField)!=this._dt.get(ixField)){
返回false;
}
}
//否则就是
返回true;
}
}

我想知道JodaTime中的任何东西是否有助于解决这个问题……您可能想检查spring实用程序类CronTriggerBean中的quartz integration如何处理这个问题:这与默认的Calendar.equals(Calendar)方法有何不同或更好?Calendar.equals更严格,不会像我希望的那样处理未设置的字段。另请参见:我并不是真的在寻找一个相同的日期,而是一个与我的“模板”或部分日期匹配的日期。将不存在的SimpleDataFormat更改为SimpleDataFormat(我自己没有足够的编辑权限来执行此操作,并且此更改需要更改至少6个字符以供同行审阅)。