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