按任意时间间隔对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分钟的块。
您只需要在分组之前偏移所有日期。
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;