使用 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);

最佳答案

首先,您应该查看如何构建相关的 LocalDate - 如果您有 WeekYearWeekOfWeekYear ,这就是您逻辑上拥有的所有信息。然后,您可以根据需要从带有LocalDateTimeLocalDate中获取一个AtMidnight-但我坚持使用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);
    }
    

    不是非常愉快或高效,但也不算太糟糕......如果你发现自己想要用 WeekOfWeekYearWeekYear 做很多工作,请提出你想做的事情的功能请求。

    编辑:就像更新一样,我们现在支持:
    LocalDate date = LocalDate.FromWeekYearWeekAndDay(year, week, IsoDayOfWeek.Monday);
    

    关于c# - 来自 Week 和 WeekYear 的 LocalDate,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11342856/

    10-14 16:44