7

NodaTime ライブラリを使用して、週番号と週 WeekYear に基づいて週の最初の曜日の LocalDate を計算するにはどうすればよいですか。

これの逆:

var date = new LocalDate(2012, 1, 1);
int weekYear = date.WeekYear;      // 2011
int weekNr = date.WeekOfWeekYear;  // 52

この偽のコードのようなもの:

var newDate = LocalDate.FirstDayFromWeek(weekYear, weekNr);
4

2 に答える 2

11

まず、関連するものを構築する方法を検討する必要があります。これが、 andLocalDateを持っている場合に論理的に持っているすべての情報です。その後、必要に応じてwithから aを取得できますが、他に何かが本当に必要になるまではそのまま使用します。そのようにすると、合成される情報が少なくなります。WeekYearWeekOfWeekYearLocalDateTimeLocalDateAtMidnightLocalDate

正直なところ、現在これを特に単純にしているとは思いませんが、基礎となるエンジンは十分な計算をサポートしているため、かなり簡単に追加できます。

API に変更を加えることなく、おそらく次のようなものを使用することをお勧めします。

  • 希望する年内の 6 月 1 日を構築します。これは同じである必要がありWeekYearます (ISO カレンダーを使用していると仮定しています...)
  • 週の最初の曜日に移動 ( date = date.Previous(IsoDayOfWeek.Monday))
  • 現在の週番号を計算する
  • 正しい週数を加算または減算する

次のようなものです:

public static LocalDate LocalDateFromWeekYearAndWeek(int weekYear,
    int weekOfWeekYear)
{
    LocalDate midYear = new LocalDate(weekYear, 6, 1);
    LocalDate startOfWeek = midYear.Previous(IsoDayOfWeek.Monday);
    return startOfWeek.PlusWeeks(weekOfWeekYear - startOfWeek.WeekOfWeekYear);
}

ひどく快適でも効率的でもありませんが、それほどWeekOfWeekYear悪くはありません...とで多くの作業をしたい場合は、やりWeekYearたいことの機能要求を上げてください。

編集: アップデートとして、これをサポートするようになりました:

LocalDate date = LocalDate.FromWeekYearWeekAndDay(year, week, IsoDayOfWeek.Monday);
于 2012-07-05T11:00:42.090 に答える