0

我有以下行来分组我的收藏:

group c by new { date = GetGroupingDateKey(DateRangeType, c.ReadDate), name = c.Name } into g

我使用以下函数来获取分组日期键:

private static DateTime GetGroupingDateKey(MeterReadingsTimeIntervals DateRangeType, DateTime Date)
{
    DateTime date = new DateTime();
    switch (DateRangeType)
    {
        case MeterReadingsTimeIntervals.Hourly:
            date = new DateTime(Date.Year, Date.Month, Date.Day, Date.Hour, 0, 0);
            break;
       case MeterReadingsTimeIntervals.Daily:
            date = new DateTime(Date.Year, Date.Month, Date.Day, 0, 0, 0);
            break;
        case MeterReadingsTimeIntervals.Weekly:

            // ???

            break;
        case MeterReadingsTimeIntervals.Monthly:
            date = new DateTime(Date.Year, Date.Month, 1, 0, 0, 0);
            break;
        case MeterReadingsTimeIntervals.Yearly:
            date = new DateTime(Date.Year, 1, 1, 0, 0, 0);
            break;
    }

    return date;
}

但我不知道每周分组(可能是特定的天间隔、10 天、15 天等)。如何每周分组?我应该使用其他方式对数据进行分组吗?

谢谢指教。

4

3 回答 3

2

也许是这样的:

date = Date.AddDays(-((Date.DayOfWeek - DayOfWeek.Monday +7)%7));
date = new DateTime(date.Year, date.Month, date.Day, 0, 0, 0);

如果您考虑每周一开始。

您可以使用以下代码进行尝试: 编辑在@Rawling 建议后编辑的代码,查看评论

DateTime dt = DateTime.Now;
dt = dt.AddDays(-((dt.DayOfWeek - DayOfWeek.Monday + 7)%7));
dt = new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0);//today is Friday and it will show Monday at the end.
于 2012-11-09T13:33:25.457 回答
1

星期取决于您使用的日历类型及其规则。有些一年的第一周从一年的第一个星期一开始,有些在星期日,等等,存在差异。

例如,您可以使用GregorianCalendar及其方法 GetWeekOfYear(DateTime)。

case MeterReadingsTimeIntervals.Weekly:
  var gc = new GregorianCalendar();
  return gc.GetWeekOfYear(Date);

现在要使其正常工作,您必须设置方法对象的返回类型或强制 weekinfo 进入相同的 DateTime (将其设置为找到的一周的星期一),

于 2012-11-09T13:27:19.403 回答
1

使用辅助功能

int DaysFromLast(DateTime date, DayOfWeek dow)
{
    return (7 + date.DayOfWeek - dow) % 7;
}

您可以使用

var date = Date.Date;
date = date.AddDays(-DaysFromLast(date, DayOfWeek.Monday));

从星期一开始的一周,依此类推。

对于任意间隔,您需要一个固定的开始日期(最好是过去);然后

var date = Date.Date;
date = date.AddDays(-((date - startDate).Days % numberOfDaysInInterval));
于 2012-11-09T13:31:24.333 回答