c# – 来自Week和WeekYear的LocalDate

使用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 – 如果您有WeekYear和WeekOfWeekYear,那么这是您在逻辑上拥有的所有信息.然后你可以从AtDidnight的LocalDate中获取一个LocalDateTime – 但是我会坚持使用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和WeekYear上做很多工作,请提出你想要做的事情的功能请求.

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

LocalDate date = LocalDate.FromWeekYearWeekAndDay(year,week,IsoDayOfWeek.Monday);

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...