C#在日期范围中按名称获取工作日的日期值

时间:2013-11-19 20:15:44

标签: c# datetime

我有string[] WeekDayNames代表工作日名称数组(如“星期一”,“星期三”)

我需要在WeekDayNames中为特定日期范围的所有日期名称设置日期。 示例:2013年11月19日至2013年11月28日周三的日期:2013年11月20日和2013年11月27日

谢谢!

2 个答案:

答案 0 :(得分:2)

你可以通过简单的循环来实现:

DateTime startDate = new DateTime(2013, 11, 19);
DateTime endDate = new DateTime(2013, 11, 28);

List<DateTime> list = new List<DateTime>();
while (startDate <= endDate)
{
    if (startDate.DayOfWeek == DayOfWeek.Wednesday)
    {
        list.Add(startDate);
    }
    startDate = startDate.AddDays(1);
}

如果使用DayOfWeek枚举而不是存储字符串值,则效果更好。

如果您想获得字符串数组WeekDayNames的每个元素的日期,那么:

DateTime startDate = new DateTime(2013, 11, 19);
DateTime endDate = new DateTime(2013, 11, 28);
string[] WeekDayNames = new[] { "Wednesday" };
List<DateTime> list = new List<DateTime>();
while (startDate <= endDate)
{
    if (WeekDayNames.Any(r=> r==  startDate.DayOfWeek.ToString()))
    {
        list.Add(startDate);
    }
    startDate = startDate.AddDays(1);
}

答案 1 :(得分:2)

首先,我会将您的字符串转换为真实的DayOfWeek ...

string[] WeekDayNames = new[] { "Monday","Wednesday" };
DayOfWeek[] days = WeekDayNames
    .Select(s => (DayOfWeek)Enum.Parse(typeof(DayOfWeek), s))
    .ToArray();
DateTime start = new DateTime(2013, 11, 19);
DateTime end = new DateTime(2013, 11, 28);

...然后你可以使用这个LINQ查询:

IEnumerable<DateTime> range = Enumerable.Range(0, (end - start).Days + 1)
    .Select(d => start.AddDays(d))
    .Where(dt => days.Contains(dt.DayOfWeek));