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

本文关键字:DateTime 任意 时间 | 更新日期: 2023-09-27 18:26:33

嗨,我正试图根据对象的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分钟的块。

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

您只需要在分组之前偏移所有日期。

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;

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

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

如果您希望从第一个事件发生的确切时间开始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;