如何选择每周最晚的日期时间?c#
本文关键字:日期 时间 每周 何选择 选择 | 更新日期: 2023-09-27 17:53:36
我必须实现一个算法,它接收一个DateTime列表,并恢复每周最新的DateTime。
的例子:
29/06/2016 -> Lastest date of the last week of the month
27/06/2016
24/06/2016 -> Lastest date of the before last week of the month
22/06/2016
21/06/2016
15/06/2016 -> Lastest of the third week
13/06/2016
...
预期的结果
29/06/2016
24/06/2016
15/06/2016
我没有问代码是谁做的,而是一些解决这个问题的指示或指示。
注意:这个答案假设你对"自然"周感兴趣,而不是真正关心年份。例如,2015年12月31日是星期四,2016年1月1日是星期五——在我看来(并在这个答案中使用算法),这些将被算作在同一个星期……毕竟,这两天之前/之后的星期一是一样的。
最简单的解决方案可能是按"开始时间"分组,然后取每组中最新的值。查找一周的开始有点尴尬,最好使用helper方法:
var latestPerWeek = dates.GroupBy(StartOfWeek)
.Select(g => g.Max())
.ToList();
...
private static DateTime StartOfWeek(DateTime date)
{
date = date.Date; // Just remove any time parts...
// 0=Sunday, 1=Monday... 6=Saturday
int sundayToSaturdayDayOfWeek = (int) date.DayOfWeek;
// 0=Monday, 1=Tuesday... 6=Sunday
int mondayToSundayDayOfWeek = ((sundayToSaturdayDayOfWeek - 1) + 7) % 7;
return date.AddDays(-mondayToSundayDayOfWeek);
}
注意,. net的"一年中的星期"处理很容易使用,但基本上不能处理这种情况。在Noda Time 2.0中,这将简单得多,但目前还没有…
这只适用于同一年的日期
我将使用CultureInfo.InvariantCulture.Calendar.GetWeekOfYear
来确定周数。然后你可以用GroupBy
来表示这个数,并对每一组进行降序排序。现在你只需要选择每周/组的First()
项目
List<DateTime> dtList = new List<DateTime>();
dtList.Add(new DateTime( 2016, 6,29));
dtList.Add(new DateTime( 2016,6, 27));
dtList.Add(new DateTime( 2016,6 ,24));
dtList.Add(new DateTime( 2016,6,22 ));
dtList.Add(new DateTime( 2016,6,21 ));
dtList.Add(new DateTime( 2016,6, 15 ));
dtList.Add(new DateTime( 2016, 6,13));
List<DateTime> dtResult = dtList
.GroupBy(x => CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(x, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday))
.Select(x => x.OrderByDescending(y => y).First())
.ToList();