【问题标题】:Get dates given a start date an end date and day of week获取给定开始日期、结束日期和星期几的日期
【发布时间】:2016-10-19 03:16:37
【问题描述】:

给定开始日期 (DateTime)、结束日期 (DateTime) 和 DayOfWeek(s) 列表。如何获取所有匹配的日期:

例子:

StartDate : "06/17/2016" 
EndDate : "06/30/2016" 
DayOfWeek(s) : [0(Monday), 1(Tuesday), 4(Friday)]

想要的结果是:

Dates = ["06/17/2016", "06/20/2016", "06/21/2016", "06/24/2016", "06/27/2016", "06/28/2016"]

【问题讨论】:

  • 到目前为止你尝试过什么?如何简单地遍历日期并检查 DayOfWeek 是否在您的条件列表中?
  • 您的日期列表似乎有点错误...您缺少 2016-06-17 这是一个星期五和您的开始日期(它们应该是独家的吗?)并且您包括 2016-06-29这是一个星期三。尽管它确实说明了为什么您需要此代码来为您解决问题,但可能值得纠正它以避免任何混淆,并易于确认答案的结果与正确的预期结果相匹配。 :)

标签: c# datetime


【解决方案1】:

这将返回 startDate 和 EndDate 之间的所有日期列表,这些日期属于给定的 dayOfWeek 枚举:

var allDays = Enumerable.Range(0, (endDate - startDate).Days + 1).Select(d => startDate.AddDays(d));
var Dates = allDays.Where(dt => dayOfWeek.Contains(dt.DayOfWeek)).ToList();

【讨论】:

  • Enum.IsDefined(dayOfWeek, dt.DayOfWeek) 会按照您的想法执行吗?第一个参数是枚举的类型,它可以简单地确定该值是否对枚举有效(请参阅msdn.microsoft.com/en-us/library/…)。我想你只想要像inputDaysOfWeek.Contains(dt.DayOfWeek) 这样的东西。其中inputDaysOfWeekIEnumerable<DayOfWeek>
  • 需要编写 typeOf 并且现在可以使用。感谢您指出克里斯。我假设dayOfWeek(s) : [0(Monday), 1(Tuesday), 4(Friday)] 是一个枚举。如果它只是任何列表或集合,那么我同意它应该是daysOfWeek.Contains(dt.DayOfWeek)。我首先回答了这个问题,但后来看到上面问题中的代码就改变了。 :)
  • 我不确定我明白你在说什么。您是否建议 OP 应该定义一个新的枚举,放入所需的值,然后检查该新枚举是否包含来自另一个枚举的匹配值?如果是这样,这听起来是个糟糕的主意!
  • 如果是这样,我已经对其进行了编辑,假设 dayOfWeek 是一个集合。感谢您的有益建议。
  • 好多了。 enum 的问题在于,它们是编译时构造,如果您仅限于已制成这样的日期的集合,则会极大地限制可重用性。例如,您也无法让用户在表单或类似表单上选择他们想要的日期。
【解决方案2】:

还有另一种可能的解决方案,我认为这很容易理解和调试,即使它比其他可能的解决方案花费更多的行数和更多的资源:

    var startDate = new DateTime(2016, 06, 17);
    var endDate = new DateTime(2016, 06, 30);

    DayOfWeek[] daysOfWeek = { DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Friday };

    List<DateTime> dates = new List<DateTime>();
    if (endDate >= startDate)
    {
        var tmp = startDate;
        tmp = tmp.AddDays(1); //I notice you didn't add 06/17/2016 that is friday, if you want to add it, just remove this line
        do
        {
            if (daysOfWeek.Contains(tmp.DayOfWeek))
                dates.Add(tmp);
            tmp = tmp.AddDays(1);
        }
        while (tmp <= endDate); //If you don't want to consider endDate just change this line into while (tmp < endDate); 
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2012-08-19
    相关资源
    最近更新 更多