【问题标题】:Group dates by week during multiple years在多年中按周分组日期
【发布时间】:2018-04-07 18:55:19
【问题描述】:

我有一个DateTime 值列表,我想将整个列表拆分为每周的子列表。

日期可能跨越多年(用户选择开始和结束日期),因此按日历周数拆分它们的解决方案最终会发生冲突。

有没有办法遍历列表,然后将每周的DateTime 值存储在一个新的二维列表中?

可用的值是从星期一到星期五,第一周和最后一周的值可能较少。

我发现的唯一相关问题是How to group dates by weeks,但它不适合我的情况。

【问题讨论】:

  • 类似这样的东西,除了按年和周数分组:stackoverflow.com/questions/363655/… ?
  • 如果您将年份乘以 100,然后加上星期,它将给出一个独特的分组。那么你将不得不处理这个案子,如果这一周跨越了两年。因此,您将测试第 1 周,如果它从周日开始,则包括在当前年份中,否则,从年份中减去 1 并添加 53。
  • 也可以,尽管它隐藏了一些含义

标签: c# list date datetime


【解决方案1】:

您可以使用this method 获取给定DateTime 的周数。然后,您可以将Enumerable.GroupBy 与包含年份和周数的匿名类型一起使用:

var yearWeekGroups = allDates.GroupBy(d => new { d.Year, WeekNum = GetIso8601WeekOfYear(d) });

如果您想要一个List<List<DateTime>>,其中每个子列表都包含一周中的日期:

List<List<DateTime>> allWeeks = yearWeekGroups.Select(g => g.ToList()).ToList();

如果您所在的国家/地区不使用 ISO 8601,您可以使用Calendar.GetWeekOfYear

var cc = CultureInfo.CurrentCulture;
var yearWeekGroups = allDates.GroupBy(d => new 
{ 
    d.Year, 
    WeekNum = currentCulture.Calendar.GetWeekOfYear(d, cc.DateTimeFormat.CalendarWeekRule, cc.DateTimeFormat.FirstDayOfWeek) 
});

【讨论】:

    猜你喜欢
    • 2017-03-27
    • 1970-01-01
    • 2011-05-16
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 2012-01-23
    • 2010-10-29
    相关资源
    最近更新 更多