代码之家  ›  专栏  ›  技术社区  ›  James McMahon

匹配Java中的日历对象?

  •  2
  • James McMahon  · 技术社区  · 16 年前

    我想让对象定义与unix crontab中的条目类似的部分日期/时间,例如“每个月的第一天”等。

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

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

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

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

    用一个 Quartz Cron Expression 是吗?

        2
  •  1
  •   Tim Frey    14 年前

    我在过去使用的一个解决方案是编写一个日期格式,该格式只使用您想要的字段来格式化日期,然后比较结果字符串。例如,通常不关心时间成分,只关心日期,因此您可能会执行以下操作:

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

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

        3
  •  0
  •   JeeBee    16 年前

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

        4
  •  0
  •   banjollity    16 年前

    会的 Google's RFC-2445 有用吗?它是一个日期递归计算器,可以让您轻松地完成“每三个月的第一个星期一”的语义。

        5
  •  0
  •   James McMahon    16 年前

    这就是我最终所做的:

    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;
        }
    }