按季度计算日期的最好方法是什么?

本文关键字:方法 是什么 季度 计算 日期 | 更新日期: 2023-09-27 18:06:35

我有一个日期集合:

 IEnumerable<DateTime> Events;

我想计数并将其分成季度(2011年第一季度,2011年第二季度等),每个季度代表三个月的桶。

我开始用一个循环和一个单独的字典"手动"完成这个转换,但我认为可能有一种更优雅的方法,使用LINQ等来完成这个转换。

我想以这样的数据结构结束:

 public List<QuarterInfo> QuarterBreakdown

其中QuarterInfo只是:

 public class QuarterInfo
 {
     public int QuarterOfYear; //1, 2, 3 or 4
     public int Year;
     public IEnumerable<DateTime> Events;
 }

注意,以上是我的想法,但我更愿意接受其他方法的建议。

按季度计算日期的最好方法是什么?

Pure LINQ, using GroupBy:

var result = Events
    .Select(d => new { DateTime = d, Q = (d.Month - 1) / 3 })
    .GroupBy(a => new { a.Q, a.DateTime.Year })
    .Select(a => new QuarterInfo
        {
            Events = a.Select(s => s.DateTime),
            QuarterOfYear = a.Key.Q + 1
        });
var QuarterBreakdown =
    from date in Events
    group date by date.Year * 4 + (date.Month - 1) / 3 into quarters
    select new QuarterInfo
    {
        Events = quarters,
        Year = quarters.Key / 4,
        QuarterOfYear = quarters.Key % 4 + 1
    };