web-dev-qa-db-ja.com

Java dateに解析するcronexpression

  • (10 18 16?* Sun、MON、WED、FRI *) cron式を使用している私のデータベースでは、Java dateに変換する方法。
  • 現在の時間と比較する方法。
  • もう1つは、cron式と比較する方法です。つまり(10 18 16?* Sun、MON、WED、FRI *)および(0 30 9 30 *?)
  • クォーツまたはスプリングスケジューリングを使用してサンプルコードを説明してください。
8
user3599212

使ってください:

import org.springframework.scheduling.support.CronSequenceGenerator;

final String cronExpression = "0 45 23 * * *";
final CronSequenceGenerator generator = new CronSequenceGenerator(cronExpression);
final Date nextExecutionDate = generator.next(new Date());

...そして、日付の比較にJodaDateTimeを使用することをお勧めします。

16
Matt

Quartz APIの org.quartz.CronExpression クラスを調べることをお勧めします。

Cron式は(通常)さまざまな日付のシーケンスを表すため、cron式を日付と単純に比較することはできないことに注意してください。いずれにせよ、次の方法が役立つ場合があります。

public boolean isSatisfiedBy(Date date)
public Date getNextValidTimeAfter(Date date)

2つのcron式の比較について、何を比較しますか? IMOが比較するのに意味があるのは、次の「トリガー」日付、つまりgetNextValidTimeAfter([some reference date])呼び出しから取得された日付だけです。

5
Jan Moravec

Cron式を処理するための小さなクラスを作成しました。ここで入手できます: https://github.com/frode-carlsen/cron

Joda-timeに基づいていますが、Java8 timeapiへの移植はかなり簡単です。これにより、Joda-timeのDateTimeオフセットを調整することで、単体テストへの埋め込み、シミュレーションの実行なども可能になります。

また、テストカバレッジもかなり良好です(TDD Kataとして実行されました)。

UpdateJava 8回のAPIもサポートするようになりましたgithubユーザーからの寄稿 https://github.com/zemiak 。どちらの場合も、式パーサーは単一の小さなクラスであり、独自のプロジェクトに簡単にコピーできます。

5
f.carlsen

おそらくあなたはチェックすることができます cron-utils それは特定の日付、例えば今を与えられた次/前の実行を取得するためのいくつかのユーティリティを持っています。 JodaTimeで動作しますが、そこからJavaDateを取得できます。ライブラリはスケジューラに依存しません。文字列にcron式を指定するだけです。 JDK6と互換性があります。

3
kekec