获取两个日期之间的周期

时间:2020-06-07 04:26:06

标签: c# datetime

如何获取两个日期之间每周的日期和星期数。

例如

  • 开始日期:2019-10-01
  • 结束日期:2020-02-01

因此以下日期应在列表中。

[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
      });

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行,该行在年末使年末处理变得明显?