32

ISO 8601では、時間間隔を表すための構文が定義されています。

時間間隔を表現するには、次の 4 つの方法があります。

  • 「2007-03-01T13:00:00Z/2008-05-11T15:30:00Z」などの開始と終了
  • 「2007-03-01T13:00:00Z/P1Y2M10DT2H30M」などの開始と期間
  • 「P1Y2M10DT2H30M/2008-05-11T15:30:00Z」などの期間と終了
  • 「P1Y2M10DT2H30M」などの期間のみ、追加のコンテキスト情報を含む

終了値に欠落している要素がある場合は、タイム ゾーンを含めて開始値と同じであると見なされます。標準のこの機能により、時間間隔の簡潔な表現が可能になります。たとえば、開始時刻と終了時刻を含む 2 時間の会議の日付は、"2007-12-14T13:30/15:30" のように単純に表示できます。"/15:30" は "/2007-12- 14T15:30" (開始と同じ日付)、または "2008-02-15/03-14" のような毎月の請求期間の開始日と終了日。"/03-14" は "/2008-03" を意味します。 -14」(スタートと同年)。

さらに、間隔表現の先頭に "R[n]/" を追加することにより、繰り返し間隔が形成されます。ここで、R は文字自体として使用され、[n] は繰り返し回数に置き換えられます。[n] の値を省略すると、無限の繰り返し回数を意味します。したがって、「2008-03-01T13:00:00Z」から「P1Y2M10DT2H30M」の間隔を 5 回繰り返すには、「R5/2008-03-01T13:00:00Z/P1Y2M10DT2H30M」を使用します。

この構文を解析するための優れた Java パーサー (可能であれば Joda-Time ライブラリと互換性がある) を探しています。良いライブラリへのポインタはありますか?

4

4 に答える 4

10

すでに Joda-Time を試したことがあると思いますか? 質問からサンプル文字列をフィードするInterval.parse(Object)と、「開始と終了」、「開始と期間」、「期間と終了」は処理できるが、暗黙のフィールドや繰り返しは処理できないことがわかります。

2007-03-01T13:00:00Z/2008-05-11T15:30:00Z => from 2007-03-01T13:00:00.000Z to 2008-05-11T15:30:00.000Z
2007-03-01T13:00:00Z/P1Y2M10DT2H30M       => from 2007-03-01T13:00:00.000Z to 2008-05-11T15:30:00.000Z
P1Y2M10DT2H30M/2008-05-11T15:30:00Z       => from 2007-03-01T13:00:00.000Z to 2008-05-11T15:30:00.000Z
2007-12-14T13:30/15:30                    => java.lang.IllegalArgumentException: Invalid format: "15:30" is malformed at ":30"
R5/2008-03-01T13:00:00Z/P1Y2M10DT2H30M    => java.lang.IllegalArgumentException: Invalid format: "R5"

私が知っている唯一の他の包括的な日付/時刻ライブラリはJSR-310です。これは、このような間隔を処理していないようです。

現時点では、Joda-Time の上に独自の改善を構築することがおそらく最善の選択です。申し訳ありません。Joda-Time で既にサポートされているもの以外に、処理する必要がある特定の ISO 間隔形式はありますか?

于 2013-04-12T22:26:00.030 に答える