0

我正在使用 EJB 3.1。在下面的代码中,我试图创建一个每年重复的计时器:

        ScheduleExpression scheduleExpression = new ScheduleExpression();
        Date now = new Date();
        scheduleExpression.start(now);     
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        scheduleExpression.minute(calendar.get(Calendar.MINUTE));
        scheduleExpression.hour(calendar.get(Calendar.HOUR_OF_DAY));
        scheduleExpression.dayOfMonth(calendar.get(Calendar.DAY_OF_MONTH));
        scheduleExpression.month(calendar.get(Calendar.MONTH));

但它不起作用,实际上行为是非常随机的(在某些重复中有效,而在另一种则无效)。

奇怪的是,我也有每月重复一次(见下面的代码)并且它正在工作。

    ScheduleExpression scheduleExpression = new ScheduleExpression();
    Date now = new Date();
    scheduleExpression.start(now);     
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(now);
    scheduleExpression.minute(calendar.get(Calendar.MINUTE));
    scheduleExpression.hour(calendar.get(Calendar.HOUR_OF_DAY));
    scheduleExpression.dayOfMonth(calendar.get(Calendar.DAY_OF_MONTH));

任何想法?

4

1 回答 1

3

对于 Java 中的公历实现,月份是从零开始的,例如Calendar的 javadocs 中所述:

公历和儒略历中的第一个月是 JANUARY,即 0;最后一个取决于一年中的月数。

ScheduleExpression中的月份是从一开始的:

月:一年中的一个或多个月

允许值:

  • [1,12]
  • {“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、十二月”}

因此,下面的代码构造 ScheduleExpression 月份是过去一个月(或者在 1 月值 0 的情况下是无效参数,但似乎没有严格指定无效情况下的行为)。

Date now = new Date();
...
scheduleExpression.dayOfMonth(calendar.get(Calendar.DAY_OF_MONTH));
于 2013-08-29T20:15:17.360 回答