当前位置: 首页 > 知识库问答 >
问题:

根据给定的DayOfWeek列表查找下一个日期时间

仉磊
2023-03-14

我有一个DayOfWeek枚举项的列表:var daysOfWeek=list

此列表包含可变数量的DaysOfWeek项目,例如星期一、星期四、星期六。

我想根据List找到任何给定DateTime的下一个DateTime

如果给定的日期是星期三,那么下一个应该返回的日期时间将是星期四。

如果给定的日期是星期四,那么下一个应该返回的日期时间将是星期六。

到目前为止,我一直在摆弄一些LINQ表达式,并尝试使用Min()扩展方法的一些选项,但并没有可以共享的代码。我想知道我是否缺少一些真正的基本LINQ功能。

到目前为止,给我一些想法的SO-Topics包括这个和那个,但是我无法用他们的答案来解决我的问题。


共有3个答案

扈瑞
2023-03-14
class Program
    {
        static DateTime NextDay(List<DayOfWeek> workingDays, DateTime dateTime)
        {
            var result = dateTime;
            var dayOfWeek = (int)dateTime.DayOfWeek;

            dayOfWeek++;
            result = result.AddDays(1);

            while (!workingDays.Any(x=> x == (DayOfWeek)dayOfWeek))
            {
                if (dayOfWeek > (int)workingDays.Last())
                {
                    var delta = ((int)workingDays.First() + 7) - dayOfWeek;
                    dayOfWeek = (int)workingDays.First();
                    result = result.AddDays(delta);

                }
                else
                {
                    dayOfWeek++;
                    result = result.AddDays(1);
                }
            }
            return result;
        }

        static void Main(string[] args)
        {
            var workingDays = new List<DayOfWeek>()
            {
                DayOfWeek.Monday,
                DayOfWeek.Thursday,
                DayOfWeek.Saturday
            };

            workingDays.Sort();

            var dayOfWeek = NextDay(workingDays, DateTime.Now);
            Console.WriteLine(dayOfWeek.ToString());

            dayOfWeek = NextDay(workingDays, DateTime.Now.AddDays(1));
            Console.WriteLine(dayOfWeek.ToString());

            dayOfWeek = NextDay(workingDays, DateTime.Now.AddDays(2));
            Console.WriteLine(dayOfWeek.ToString());

            dayOfWeek = NextDay(workingDays, DateTime.Now.AddDays(3));
            Console.WriteLine(dayOfWeek.ToString());

            Console.ReadLine();
        }
    }
}
舒枫涟
2023-03-14

您可以在列表中计算明天和下周之间的(非负)距离,然后使用最小距离来获取新日期:

var tomorrowDOW = startDate.AddDays(1).DayOfWeek;
var dist = daysOfWeek.Select(w => (w - tomorrowDOW + 14) % 7).Min();
var nextDate = startDate.AddDays(dist + 1);
司马辉
2023-03-14
public static DateTime GetNextDateOrSomething(DateTime start, IEnumerable<DayOfWeek> weekdays)
{
    if (!weekdays.Any()) throw new ArgumentException($"{nameof(weekdays)} cannot be empty.");
    var increments = Enumerable.Range(1, 6);
    var matchedIncrement = increments.FirstOrDefault(i => weekdays.Contains(start.AddDays(i).DayOfWeek));
    return start.AddDays(matchedIncrement > 0 ? matchedIncrement : 7);
}

[DataTestMethod]
[DataRow("4/10/2019", "Wednesday,Thursday", "4/11/2019")]
[DataRow("4/10/2019", "Thursday", "4/11/2019")]
[DataRow("4/10/2019", "Monday,Tuesday", "4/15/2019")]
[DataRow("4/10/2019", "Tuesday", "4/16/2019")]
public void TestDateMethod(string start, string weekdays, string expected)
{
    var startDate = DateTime.Parse(start);
    var weekDaysList = weekdays.Split(',').Select(d => (DayOfWeek)Enum.Parse(typeof(DayOfWeek), d));
    var expectedDate = DateTime.Parse(expected);
    var result = GetNextDateOrSomething(startDate, weekDaysList);
    Assert.AreEqual(expectedDate, result);
}
 类似资料:
  • 问题内容: 如何查询SQL Server的SQL Server 2005表列的创建日期? 我尝试获取该信息,但是创建日期未包含在此存储过程中。 如何才能做到这一点? 问题答案: 有一个名为sys.Columns的系统表,您可以从中获取列信息。如果要查看特定表的列,可以执行以下操作: 或者,您可以获取如下表信息: 但是我找不到有关列创建日期的任何信息。 更新: 这可能会有所帮助。

  • 问题内容: 给定一个特定的日期(例如2011-07-02),我如何找到该日期之后的下一个星期一(或该日的任何工作日)的日期? 问题答案:

  • 问题内容: 我的问题类似于以下问题: http://asktom.oracle.com/pls/asktom/f?p=100:11:0:::::P11_QUESTION_ID:14582643282111 区别在于我的内部查询返回两条记录,而我有外部查询。 我需要编写类似这样的内部查询,这将为我提供两个日期范围之间的日期列表(我正在尝试不执行此查询)。 我的内部查询返回以下2行: 所以我需要内部查

  • 问题内容: 我需要使用JavaScript根据下拉菜单A中的选择更改下拉菜单B的内容。没有涉及到数据库查询- 我事先知道应该在A中选择B的内容。我已经找到了一些使用AJAX的示例,但是由于没有涉及到数据库查询,所以没有必要。谁能为我指出一些示例代码以实现此目的? 问题答案: function configureDropDownLists(ddl1, ddl2) {

  • 问题内容: 我想在下一个(例如)星期一的日期/时间创建的实例。 Java Time API中是否有任何方法,还是应该计算当前日期和目标日期之间有多少天,然后使用LocalDateTime.of()方法? 问题答案: 无需手动进行任何计算。 您可以使用方法通过调节器来调节给定的日期。一周的第二天有内置的调节器: 返回下一个星期几调整器,它将日期调整为在调整日期之后指定的星期几中的第一个匹配项。 该代

  • 本文向大家介绍根据世界标准时间将一个月的日期设置为指定的日期?,包括了根据世界标准时间将一个月的日期设置为指定的日期?的使用技巧和注意事项,需要的朋友参考一下 JavaScript date setUTCDate()方法根据通用时间设置指定日期的月份。 以下是setUTCDate(dayValue)的参数- dayValue -1到31之间的整数,代表一个月中的一天。 示例 您可以尝试运行以下代码