来自Week和WeekYear的LocalDate

时间:2012-07-05 10:52:42

标签: c# nodatime

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

2 个答案:

答案 0 :(得分:8)

首先,您应该考虑如何构建相关的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);

答案 1 :(得分: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