如何获取两个日期之间每周的日期和星期数。
例如
因此以下日期应在列表中。
[Week:40] 2019-10-01 ~ 2019-10-06
[Week:41] 2019-10-07 ~ 2019-10-13
[Week:42] 2019-10-14 ~ 2019-10-20
[Week:43] 2019-10-21 ~ 2019-10-27
[Week:44] 2019-10-28 ~ 2019-11-03
[Week:45] 2019-11-04 ~ 2019-11-10
[Week:46] 2019-11-11 ~ 2019-11-17
[Week:47] 2019-11-18 ~ 2019-11-24
[Week:48] 2019-11-25 ~ 2019-12-01
[Week:49] 2019-12-02 ~ 2019-12-08
[Week:50] 2019-12-09 ~ 2019-12-15
[Week:51] 2019-12-16 ~ 2019-12-22
[Week:52] 2019-12-23 ~ 2019-12-29
[Week:53] 2019-12-30 ~ 2019-12-31
[Week:1] 2020-01-01 ~ 2020-01-05
[Week:2] 2020-01-06 ~ 2020-01-12
[Week:3] 2020-01-13 ~ 2020-01-19
[Week:4] 2020-01-20 ~ 2020-01-26
[Week:5] 2020-01-27 ~ 2020-02-01
这是我的代码:
var date = new DateTime(DateTime.Today.Year, 1, 1);
var startOfFirstWeek = date.AddDays(1 - (int)(date.DayOfWeek));
var weeks =
Enumerable
.Range(0, 54)
.Select(i => new {
weekStart = startOfFirstWeek.AddDays(i * 7)
})
.TakeWhile(x => x.weekStart.Year <= date.Year)
.Select(x => new {
x.weekStart,
weekFinish = x.weekStart.AddDays(6)
})
.SkipWhile(x => x.weekFinish < date.AddDays(1))
.Select((x, i) => new {
x.weekStart,
x.weekFinish,
weekNum = i + 1
});
答案 0 :(得分:1)
为此使用LINQ相当复杂。循环可能会更简单:
var st = new DateTime(2019, 7, 1);
var ed = new DateTime(2020,6,1);
var ey = new DateTime(st.Year,12,31);
while(st <= ed){
var e = st.AddDays(6 - Math.Min((int)st.DayOfWeek,6));
if(st.Year < e.Year)
e = ey;
if(e > ed)
e = ed;
Console.Write($"[Week:{((st.DayOfYear-1)/7)+1}] {st:yyyy-MM-dd} ~ {e:yyyy-MM-dd}");
st = e.AddDays(1);
}
此处的逻辑是采用开始日期并使用星期几来计算该周的结束日期。通常,这是从开始日期算起的6天,但是第一次迭代可以不同
然后我们检查年份是否更改,如果有更改,则将结束日期与结束日期挂钩
然后,我们检查是否已超过结束日期,如果已结束,则将其固定到结束日期
打印/添加/任何内容
然后再次进入下一周作为开始日期,这也有助于进行循环控制
注意:年度代码可能与日历相关,也可以采用不同的解释-请参见Week of Year C# Datetime之类的内容,以了解如何计算公历,或者采用基本方法((DayOfYear-1)/7)+1
我只是不确定您的逻辑是将输出减少到4行,您是否打算给出一个示例2行,该行在年末使年末处理变得明显?