9

Goals

I have a list of LocalDate items that represent sets of start dates and end dates.

I would like to be able to store date ranges, so that I can perform operations on them as a set of overlapping or distinct ranges, etc.

Questions

  • Does NodaTime provide some sort of DateRange construct that I've missed in the docs?
  • Am I thinking about this wrong? Is there a more natural / preferred way to accomplish this that NodaTime already allows for?
  • Am I setting myself up for trouble by attempting to think about a date range using a LocalDate for a start and an end date?

I'm completely new to NodaTime and assuming that this is a conceptual misunderstanding on my part.

Update: I noticed a similar question on the subject from 2009, but that seems to refer to another utilies class; I'm assuming that since then NodaTime may have evolved to accomodate this situation.

4

1 に答える 1

16

Noda Time は、値Intervalの範囲の型をInstant提供しますが、他の型の範囲型を提供しません。この理由の一部は、さまざまな型で範囲がどのように使用されるかというニュアンスにあります。

インスタントの範囲を指定すると、常にハーフ オープン インターバルとして扱われます。開始値は含まれますが、終了値は除外されます。人間は、時間の値を指定するたびに自然にこれを行います。たとえば、イベントが から1:00まで実行されると言うときなどです。これ2:00は明らかに、イベントが 2:00 に終了することを意味するため、2:00 は除外されます。

ただし、カレンダーの日付範囲全体では、通常、終了日が含まれます。1 月全体を (LocalDate値の範囲として) 表すには、おそらく 1 月 1 日から 1 月 31 日までとします。最後の日もすべて含めています。

これらのことを強制するためにいくつかの範囲タイプを追加することもできますが、必要に応じてそれらを作成できる場合、API でそれらを使用することにどれだけの価値があるかを考える必要があります。私はどちらにせよ賛成とも反対とも言いませんが、それはおそらくNoda Time ユーザー グループで議論されることになるでしょう。

特定の質問に答えるには:

  • いいえ、現地の日付には定義済みの範囲クラスはありません。
  • 他に考慮すべき唯一のことは、通常、カレンダーの計算はPeriodクラスを介して行われるということです。たとえば、2 つの暦日の間に何日あるのかを調べるには、次のようにします。

    LocalDate ld1 = new LocalDate(2012, 1, 1);
    LocalDate ld2 = new LocalDate(2013, 12, 25);
    Period period = Period.Between(ld1, ld2, PeriodUnits.Days);
    long days = period.Days;
    
  • いいえ、ローカル日付の範囲クラスを作成することに何の問題もありません。多くの利点はないかもしれません。独自のクラスにStartDateとの2 つのプロパティを設定することで、同様のことができます。EndDate終了日の包含性と、間隔または時間範囲で見られる排他性に注意してください。

そして最後に、あなたはこう言いました。

...重複または個別の範囲などのセットとしてそれらに対して操作を実行できるようにします。

おそらく、交差、結合、ギャップの計算、並べ替えなどの操作を探しているでしょう。これらはTime Period Libraryによって定義されていますが、野田時間には現在そのようなものはありません。それを作成する場合は、おそらくコンパニオン ライブラリ ("NodaTime.Ranges" でしょうか?) にあるはずです。それをコアに引き込むことは望ましくないでしょうが、あなたにはわかりません...

DateTimeその Time Period Library を使用することになった場合は、それがのみで動作し、完全に無視されることを認識してくださいDateTimeKind。したがって、生産性を高めるには、UTC 値または「指定されていない」カレンダーの日付のみを使用していることを確認し、「1 日は何時間ですか」などの質問をしないようにする必要があります。夏時間への移行がある日は間違っています。

于 2013-12-15T23:55:15.050 に答える