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

Linq lambda表达式-查找一周中距离当前日期最近的一天(现在)

岳涵煦
2023-03-14

例如,我有星期一、星期四和星期日作为抽签日期。找到离日期时间最近的星期几的方法是什么。现在使用Linq Lambda?我用正常功能完成了这一点,但我想知道如何使用Linq Lambda?

我的方法示例

    public static DateTime GetSoonestDrawDate(this DateTime from, IEnumerable<LotteryDrawDate> drawDates)
    {

        int hour = 0;
        int minute = 0;

        bool todayDrawOnly = true;

        int difference = 7;
        int tempDifference = 0;

        int todayDay = (int)from.DayOfWeek;
        int drawCutOffDay = 0;

        if (todayDay == 0)
        {
            todayDay = 7;
        }

        var tempCutOffTime = new TimeSpan(23, 59, 59);

        foreach (var drawDate in drawDates)
        {
            // DayId is DayOfWeek
            drawCutOffDay = drawDate.DayId;

            if (drawCutOffDay < todayDay)
            {
                drawCutOffDay += 7;
            }

            tempDifference = drawCutOffDay - todayDay;

            var cutOffTime = new TimeSpan();
            cutOffTime = TimeSpan.Parse(drawDate.CutOffTime);

            if ((difference > tempDifference) || difference == 0)
            {
                // draw date is not today
                if (tempDifference != 0)
                {
                    difference = tempDifference;
                    hour = cutOffTime.Hours;
                    minute = cutOffTime.Minutes;
                    todayDrawOnly = false;
                }
                // same day, cutOffTime still available
                if ((tempDifference == 0 && cutOffTime > from.TimeOfDay))
                {
                    // we use tempCutOffTime to compare newest cutOffTime in case we have more cutOffTimes on the same day
                    // in that case we have to select the soonest cutOffTime of the day
                    if (cutOffTime < tempCutOffTime)
                    {
                        difference = tempDifference;
                        hour = cutOffTime.Hours;
                        minute = cutOffTime.Minutes;
                        todayDrawOnly = true;
                        tempCutOffTime = cutOffTime;
                    }
                }
                // same day selected only, but cutOffTime passed, so we add another week only in case there is only one draw date and draw date is on the same day
                else if (tempDifference == 0 && cutOffTime < from.TimeOfDay && todayDrawOnly == true)
                {
                    if (cutOffTime < tempCutOffTime)
                    {
                        difference = 7;
                        hour = cutOffTime.Hours;
                        minute = cutOffTime.Minutes;
                        todayDrawOnly = true;
                        tempCutOffTime = cutOffTime;
                    }
                }
            }
        }

        from = from.AddDays(difference);

        DateTime soonest = new DateTime(from.Year, from.Month, from.Day, hour, minute, 0);

        return soonest;
    }

共有3个答案

法烨烨
2023-03-14

如果你想要一个简单的抽签日硬编码列表,你可以这样做:

DateTime GetNextDate(DateTime from)
{
    DayOfWeek target;
    switch (from.DayOfWeek)
    {
        case DayOfWeek.Friday:
        case DayOfWeek.Saturday:
        case DayOfWeek.Sunday:
            target = DayOfWeek.Sunday;
            break;
        case DayOfWeek.Monday:
            target = DayOfWeek.Monday;
            break;
        case DayOfWeek.Tuesday:
        case DayOfWeek.Wednesday:
        case DayOfWeek.Thursday:
            target = DayOfWeek.Thursday;
            break;
        default:
            throw new ArgumentException("from");
    }
    while (from.DayOfWeek != target)
        from = from.AddDays(1);
    return from;
}
祁杰
2023-03-14

找到未来最近一天的简单方法如下:

DayOfWeek[] draw_days = { DayOfWeek.Sunday, DayOfWeek.Monday, DayOfWeek.Thursday };
Console.WriteLine(
  "Nearest Draw Date: {0}",
  draw_days.Min(d => (d <= DateTime.Now.DayOfWeek) ? (d + 7) : d)
);
叶谦
2023-03-14

因为您没有展示lotterydawdate的样子,所以我只使用DayOfWeek准备了一个小样本。你必须把时间延长到你自己的时间。

public static DateTime GetSoonestDrawDate(this DateTime from, IEnumerable<DayOfWeek> drawDates)
{
    var realDrawDates = drawDates.SelectMany(x => new[] { (int)x, (int)x + 7 }).OrderBy(x => x);
    var difference = realDrawDates.SkipWhile(x => x < (int)from.DayOfWeek).First() - (int)from.DayOfWeek;
    return from.AddDays(difference);
}

小测试代码:

var drawDates = new[] { DayOfWeek.Monday, DayOfWeek.Wednesday, DayOfWeek.Saturday };

for (int i = 0; i < 15; i++)
{
    var from = DateTime.Now.AddDays(i);
    Console.WriteLine("{0} - {1}", from.ToShortDateString(), GetSoonestDrawDate(from, drawDates).ToShortDateString());
}

打印(从-下一页):

11/18/2013 - 11/18/2013
11/19/2013 - 11/20/2013
11/20/2013 - 11/20/2013
11/21/2013 - 11/23/2013
11/22/2013 - 11/23/2013
11/23/2013 - 11/23/2013
11/24/2013 - 11/25/2013
11/25/2013 - 11/25/2013
11/26/2013 - 11/27/2013
11/27/2013 - 11/27/2013
11/28/2013 - 11/30/2013
11/29/2013 - 11/30/2013
11/30/2013 - 11/30/2013
12/1/2013 - 12/2/2013
12/2/2013 - 12/2/2013
 类似资料:
  • 问题内容: 我需要最快的方式来获得一周的第一天。例如:今天是11月11日,是星期四;我想要本周的第一天(即11月8日)和一个星期一。我需要用于MongoDB地图功能的最快方法,有什么想法吗? 问题答案: 使用Date对象的方法,您可以知道星期几(0 =星期日,1 =星期一,等等)。 然后,您可以减去该天数加一,例如:

  • 问题内容: 我们有一个实用程序,它将在周一至周五之间的任何一天运行。它将在内容管理工具中更新一些文件。与该文件关联的最后修改日期应该是该周的星期一日期。我编写了以下程序来检索当前周的星期一日期。但是我仍然不确定这是否适用于所有情况。有谁有更好的解决方案? 问题答案: 我强烈建议您改用Joda Time(对于您的所有日期/时间工作,而不仅限于此): 请注意,正如您在此处所使用的 星期一 (即Joda

  • 我的程序中有这5个按钮:星期一、星期二、星期三、星期四和星期五,它们在我的菜单屏幕上。我现在想要的是,当我的程序启动和我的菜单屏幕打开时,按钮包含的日子+一天的日期。 例如,今天我们是5月4日(星球大战快乐日!)按钮应该是这样的: 星期一04/30星期二05/01星期三05/02星期四05/03星期五05/04 但是当我打开下个星期一的菜单屏幕时,它应该是这样的:星期一05/07星期二05/08星

  • 问题内容: 我有一个日期对象列表和一个目标日期。我想在列表中找到最接近目标日期的日期,但仅找到目标日期之前的日期。 示例:2008-10-1 2008-10-2 2008-10-4 目标日期为2008-10-3,我想获得2008-10-2 最好的方法是什么? 问题答案: Sietse de Kaper解决方案采用了 反向 排序的列表,绝对不是最自然的解决方案 Java中的自然排序顺序遵循递增的自然

  • 问题内容: 如何以这种格式从现在开始在Android之前的一周之前获取日期: 例如:现在,一周前 谢谢 问题答案: 解析日期: 然后计算出您需要减去的毫秒数: 或使用该类提供的API : 然后,如果需要,将其转换回字符串:

  • 我有一个表,其中存储了里程碑(id、描述、日期),并且给定了一些事件日期,我希望找到最接近该日期的里程碑。 我正在使用Spring Data JPA,但我似乎不知道该怎么做。根据可用的函数,似乎没有任何本身可用的东西来查找最接近的日期。目前,我想到的最好的主意是使用原始sql,类似于 然后,我会在我的存储库上有一个函数,例如 我对这种方法的主要关注点是,我必须依赖于特定于DBMS的函数来执行日期差