来自Week和WeekYear的LocalDate

Tom*_*rst 6 c# nodatime

使用NodaTime库,如何根据周数和周WeekYear计算一周中第一天的LocalDate.

与此相反:

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

像这样的假代码:

var newDate = LocalDate.FirstDayFromWeek(weekYear, weekNr);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

首先,你应该看看如何构建相关的LocalDate- 如果你有一个WeekYear和那个,那就是你逻辑上拥有的所有信息WeekOfWeekYear.然后,您可以得到一个LocalDateTimeLocalDateAtMidnight,如果你真的想要的-但我会坚持使用LocalDate,直到你真正需要的任何东西,因为这样你合成的信息较少.

我不相信我们目前使这一点特别简单,说实话 - 虽然底层引擎支持足够的计算,我们可以相当容易地添加它.

如果不对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);
}
Run Code Online (Sandbox Code Playgroud)

并不十分愉快的或有效率,但不是糟糕......如果你发现自己想要做了很多工作,与WeekOfWeekYearWeekYear,请提高对那种你想要做的事情功能要求.

编辑:作为更新,我们现在支持这个:

LocalDate date = LocalDate.FromWeekYearWeekAndDay(year, week, IsoDayOfWeek.Monday);
Run Code Online (Sandbox Code Playgroud)