我有以下行来分组我的收藏品:
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天等)。我怎样才能每周分组?我应该使用其他方式对数据进行分组吗?
感谢您的建议。
答案 0 :(得分: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.
答案 1 :(得分:1)
本周取决于您使用的日历类型及其规则。有些人在今年的第一个星期一开始一年的第一周,有些在星期日开始,等等,有差异。
例如,您可以使用GregorianCalendar及其方法GetWeekOfYear(DateTime)。
case MeterReadingsTimeIntervals.Weekly:
var gc = new GregorianCalendar();
return gc.GetWeekOfYear(Date);
现在要使其工作,你必须制作方法对象的返回类型或强制将weekinfo放入相同的DateTime(将其设置为找到周的星期一),
答案 2 :(得分: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));