按任意时间间隔对DateTime进行分组

时间:2013-08-06 13:07:30

标签: c# linq

您好我正在尝试按DateTime属性对对象集合进行分组,我遇到了一个奇怪的问题。目前我有以下内容:

TimeSpan interval = TimeSpan.FromMinutes(45);
var selected = from date in item.Dates
               group date by (date.Ticks / interval.Ticks) into g
               select g;

这基本上有效,但如果第一项的时间是11:45那么第一组只有15分钟长。接着是从12:00开始的下一组,并从那里正确分组。我错过了一些非常简单的事情,还是我需要改变我尝试分组的方式?我真正想做的是将我的所有对象分成45分钟的块。

2 个答案:

答案 0 :(得分:2)

您只需要在分组前抵消所有日期。

TimeSpan offset = startTime.TimeOfDay;
TimeSpan interval = TimeSpan.FromMinutes(45);
var selected = from date in item.Dates
           group date by ((date.Ticks - offset.Ticks) / interval.Ticks) into g
           select g;

答案 1 :(得分:1)

这里的问题是你已经在"时间组轴"中定义了单位。 (45分钟),但您没有明确定义轴的起始位置。

当前代码分组将从00:00开始,因此每次最终到达11:15(这是11:15-12:00组的开始)时添加45分钟。实际进入该组的第一个事件的时间不起作用。

如果您想要从第一个事件发生的确切时间开始的45分钟组补偿:

// In your current version this is effectively TimeSpan.Zero
var startOfAxis = item.Dates.Min().TimeOfDay;

var interval = TimeSpan.FromMinutes(45);
var selected = 
    from date in item.Dates
    group date by ((date.Ticks - startOfAxis.Ticks) / interval.Ticks) into g
    select g;