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 で説明されているように、月はゼロから始まります。

グレゴリオ暦とユリウス暦の年の最初の月は 1 月で、これは 0 です。最後は、1 年の月数によって異なります。

ScheduleExpressionの月は 1 から始まります。

month : 1 年のうちの 1 つ以上の月

許容値:

  • [1,12]
  • {"1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", 12月"}

その結果、以下のコードはScheduleExpressionを構成します。月は過去1か月です(または、1月の場合、値0は無効な引数ですが、無効な場合の動作は厳密に指定されていないようです)。

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