【发布时间】:2015-07-14 08:37:05
【问题描述】:
只是想知道是否有更优化和/或更简洁的方式(例如使用 LINQ)来编写我在下面获得的两个日期之间的工作周日期范围列表?
这是我目前拥有的..
// Some storage
public class Bucket
{
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
// Other code removed for brevity ...
DateTime start = new DateTime(2015, 7, 1);
DateTime end = new DateTime(2015, 9, 1);
DayOfWeek firstDayOfWeek = DayOfWeek.Monday;
DayOfWeek lastDayOfWeek = DayOfWeek.Friday;
var buckets = new List<Bucket>();
var currentDate = start;
DateTime startOfBucket = currentDate;
DateTime endOfBucket = currentDate;
while (currentDate <= end)
{
var currentDayOfWeek = currentDate.DayOfWeek;
// Skip days outside the business week
if (currentDayOfWeek >= firstDayOfWeek && currentDayOfWeek <= lastDayOfWeek)
{
if (currentDayOfWeek == firstDayOfWeek)
{
// Start a new bucket
startOfBucket = currentDate;
}
if ((currentDayOfWeek == lastDayOfWeek) || (currentDate == end))
{
// End of bucket
endOfBucket = currentDate;
// Create bucket
buckets.Add(new Bucket()
{
StartDate = startOfBucket,
EndDate = endOfBucket
});
}
}
currentDate = currentDate.AddDays(1);
}
这会给我以下日期范围...
- 开始:2015 年 7 月 1 日结束:2015 年 7 月 3 日
- 开始:2015 年 7 月 6 日结束:2015 年 7 月 10 日
- 开始:2015 年 7 月 13 日结束:2015 年 7 月 17 日
- 开始:2015 年 7 月 20 日结束:2015 年 7 月 24 日
- 开始:2015 年 7 月 27 日结束:2015 年 7 月 31 日
- 开始:2015 年 8 月 3 日结束:2015 年 8 月 7 日
- 开始:2015 年 8 月 10 日结束:2015 年 8 月 14 日
- 开始:2015 年 8 月 17 日结束:2015 年 8 月 21 日
- 开始:2015 年 8 月 24 日结束:2015 年 8 月 28 日
- 开始:2015 年 8 月 31 日结束:2015 年 9 月 1 日
注意第一周和最后一周故意不是整周(它们遵守给定的日期范围)。
编辑 here 提供的解决方案给出了两个日期之间的天数,但我有兴趣获取日期范围的集合。
另外,我不需要考虑任何假期。
谢谢,
【问题讨论】:
-
公共假期你想做什么?工作周并不总是周一到周五的文化?
-
@serhiyb 我特别喜欢 José Silva 的回答
-
@RoyT。他的答案仍然每天都在迭代,而接受/赞成的答案确实提供了 O(1) 中的答案。
-
@JonSkeet Hi Jon .. 这是一个基本范围,因此不考虑任何假期。谢谢