6

たとえば、次のコードがある場合:

var nodaStart = new LocalDate(2012, 5, 1);
var nodaEnd = new LocalDate(2012,5,2);
var daysBetween = Period.Between(nodaStart, nodaEnd,PeriodUnits.Day);

それでdaysBetween.Days == 1

ただし、私が計算する範囲は、それを2日としてカウントする必要があります。つまり、開始日と終了日を含める必要があります。

実際の方法では、開始日と終了日(1年以内の間隔)を取得して終了することができ、日数を計算する必要があります。31日を超える場合、残りは丸1週間の数として返されます。

私はそのロジックを正常に機能させていますが、カウントが排他的であるため、私は1日です。

startDate.addDays(-1)作成する前にできると思いますnodaStartが、野田にピリオドを返してもらうためのもっとエレガントでかわいらしい方法があるのではないかと思います。

ありがとう


更新:クラスのソースコードを読み取りましたが、演算子がオーバーロードされているため、追加できますPeriod+

daysBetween += Period.FromDays(1);
4

2 に答える 2

6

(申し訳ありませんが、これに答えるのにとても時間がかかりました-私はそれを前に見たことがありませんでした。)

いずれか

  • 計算する前に1日を最後に追加します(これは最も論理的なアプローチです、IMO-Rogerが言うように、効果的に翌日の開始が必要です)
  • 計算する前に開始から1日を引く
  • あなたが終わりから抜け出す日数に1を加える

大丈夫なはずです。野田時間はこれをもっと簡単にするために変わるとは思いません。Betweenは、減算演算子の一種の「ファジーアラウンドユニット」バージョンです。2-1が2である場合、多くの減算演算子は見つかりません。

于 2012-11-11T21:23:52.043 に答える
0

「あいまいな」頭脳のある人間の場合、1日、1週間、1か月など(の倍数を参照)を識別する場合、開始日と終了日を含む日数を考慮することができるため、次のようにコーディングできます。

var start = new NodaTime.LocalDateTime(s.Year, s.Month, s.Day, s.Hour, s.Minute);
var end = new NodaTime.LocalDateTime(e.Year, e.Month, e.Day, e.Hour, e.Minute);

NodaTime.Period periodInclusive = NodaTime.Period.Between(start, end.PlusDays(1), NodaTime.PeriodUnits.AllDateUnits);
NodaTime.Period period =  NodaTime.Period.Between(start, end, NodaTime.PeriodUnits.AllDateUnits);
bool isInclusivePeriod = periodInclusive.Days + periodInclusive.Weeks + periodInclusive.Months + periodInclusive.Years < 
                         period.Days + period.Weeks + period.Months + period.Years;

period = isInclusivePeriod ? periodInclusive : period;
// do stuff with period here....
于 2017-10-16T10:38:55.577 に答える