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

首先,您应该研究如何构建相关LocalDate信息 - 如果您有一个WeekYearand ,这就是您在逻辑上拥有的所有信息WeekOfWeekYearLocalDateTime如果你真的想要的话,你可以从一个LocalDatewith中得到一个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);
}

不是非常愉快或高效,但也不算WeekOfWeekYear糟糕......如果您发现自己想用and做很多工作WeekYear,请针对您想做的事情提出功能请求。

编辑:就像更新一样,我们现在支持这个:

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

下面的代码返回 2018-11-04 作为第 44 周的第一天:

LocalDate.FromWeekYearWeekAndDay(2018, 44, IsoDayOfWeek.Sunday);

但是日期 2018-10-28, 2018-10-29, 2018-10-30, 2018-10-31, 2018-11-01, 2018-11-02, 2018-11-03 以下代码返回周44 号:

WeekYearRules
.FromCalendarWeekRule(
    CultureInfo.InvariantCulture.DateTimeFormat.CalendarWeekRule,
    CultureInfo.InvariantCulture.DateTimeFormat.FirstDayOfWeek)
.GetWeekOfWeekYear(new LocalDate(2018, 10, 28));

所以看起来这两个函数的实现不匹配。对我来说,第二种情况似乎给出了正确的值,而第一种情况可能没有考虑到CalendarWeekRuleFirstDayOfWeek

于 2018-11-06T16:55:43.983 回答