ジョーダタイム:期間、間隔、期間の違いは何ですか?


192

ジョダタイム 2、時間スパンの3種類の違いは何ですか。

  • 限目
  • 間隔
  • 期間

    1. なぜ3つのクラスが必要なのですか?

    2. どちらのほうがパフォーマンスが良いですか?

    3. 期間、期間、または間隔のインスタンスの分割が実装されていないのはなぜですか?例えばp = p.divideBy(2);


3
この日時の用語はまだ標準化されていないことに注意してください。ISO-8601の標準の考え方期間はジョダタイムが考えるものですPeriod。そのような用語を標準化する提案が提起されましたが、まだ達成されていません。
バジルブルク2015

回答:


246

3つのクラスが必要なのは、それらが異なる概念を表すため、相対的なパフォーマンスではなく、ジョブに適したクラスを選択することの問題です。斜体で私が追加したコメント付きのドキュメントから:


間隔 Jodaの時間では、別の瞬間に、1ミリ秒時点からの時間間隔を表します。両方のインスタントは、タイムゾーンを備えた日時連続体で完全に指定されたインスタントです。特定の時刻が定義されます。たとえば、これは昨日の20:00:00GMTから今朝の09:00:00GMTまでの間隔である可能性があります。

期間ジョダタイムでは、ミリ秒単位で測定された時間の長さを表しています。多くの場合、期間は間隔から取得されます。つまり、間隔の終わりから開始を減算して、期間を導き出すことができます

期間ジョダタイムでは、例えば、3年5ヶ月2日と7時間、フィールドの用語で定義された期間を表しています。これは、ミリ秒の点で不正確であるという点で、期間とは異なります。期間は、それが相対的である瞬間(時系列とタイムゾーンを含む)を指定することによってのみ、正確なミリ秒数に解決できます。たとえば、1年の期間を考えます。これを1月1日に追加すると、常に次の1月1日に到着しますが、期間は、うるう年かどうかによって異なります。同様に、月の1日に1か月を追加すると、翌月の1日に到着しますが、期間(ミリ秒単位)は問題の月に基づいて異なります


質問3では、持続時間からミリ秒数を常にlong(を使用してgetMillis())取得し、それを除算して新しい持続時間を(を使用してnew Duration(long duration))作成できるため、持続時間を分割する特定の方法は実際には必要ありません。

期間の分割は、上記の期間の定義に基づく実際の意味はありません。例えば半月とは何ですか?(その長さは月によって異なります)。


1
期間を分割することには意味があると思います。半月はまだ有効な時間単位ですが、正確にどれだけ長いかを知るためには開始日が必要です(月が有効な期間とまったく同じように)。
ハドリー、

11
Jodatimeは、ピリオドをINTEGER値フィールドのタプルと見なし、小数値を許可しません。これは一般的な(民事)使用と一致しています。「1か月と10日」を2で割った値が「半月と5日」であると考える一般的な生活の誰もいない。その除算を行う必要がある場合は、おそらく期間(物理的時間)に行きたいでしょう。
Leonbloy、

90

mikejの答えに追加するには:

ジョダタイム 期間は、「物理的な」時間間隔です。例えば:

12000 milliseconds <-これは期間です

Joda-Time 間隔は、実際には2つの瞬間(開始瞬間-終了瞬間)です。ここでも、瞬間とは「物理的」な概念であり、タイムラインのポイントです。例(可能な表記のみ):

(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC) <-これは間隔です

したがって、間隔期間に変換できますが、その逆はできません。

次の2つの間隔を検討してください。

I1=(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC)

I2=(2010/3/3 21:00:00.000 UTC ; 2010/3/3 22:00:00.000 UTC)

エンドポイントが異なるため、間隔として、I1およびI2異なります。しかし、それらを期間に変換すると、同じ結果が得られます3600000 milliseconds

(数学の類推:間隔[10,12][95,97]は異なる間隔ですが、長さは同じです"間隔の長さ"durationにマップされます)。

最後に、期間は「市民の時間」の経過であり、月、日、時間などの数で表されます。それ自体は「物理的な」間隔を表すものではないため、直接に変換することはできません。期間(月には可変長があります...)。

これが質問3に答えます。物理的な時間(期間)を2で除算することしかできません。


2で割った4か月は2か月になります。なぜそれが有効ではないのですか?
ハドリー、

1
「2か月」をどのように計算しますか。18日を3で割った?そのような操作に対して一貫した定義を取得することはできません。
Leonbloy、

3
一貫した定義が得られると思いますが、「2ヶ月18日」の1/3の時間と考えなければなりません。インターバルに変換するまで、それが正確に何であるかを理解することはできません。JODAがサポートしていないからといって、無効であることを意味するものではありません。
ハドリー、

@hadley「1日の3分の1」の民事的な定義はありません。たとえば、契約の1日の3分の1は無効です。
ipavlic 2012

4
@リチャードワトソン日数は、DSTのため、23時間、24時間、または25時間になることがあります。したがって、「...から始まる1日の3分の1」は有効ですが、「3分の1」は無効です。
ipavlic 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.