C# 给定DayOfWeek编号,查找前一周中某一天的日期

C# 给定DayOfWeek编号,查找前一周中某一天的日期,c#,datetime,C#,Datetime,这可能是令人尴尬的简单,但我有一个“不会做基础数学”的一天 我有一个系统,我们根据哪一天切断订单,因此,例如,周五下午4点之后,你不能为下一个周日下单,或者周二下午2点之后,你不能为第二天下单。知道我需要在5月4日星期日(截止日期)说“好”,然后让它告诉我5月2日星期五 所以我有下面的代码,它不能正常工作 int offset = (int)reqDate.DayOfWeek - thiscafeday.day_number; DateTime cutoffDateTime = reqDate

这可能是令人尴尬的简单,但我有一个“不会做基础数学”的一天

我有一个系统,我们根据哪一天切断订单,因此,例如,周五下午4点之后,你不能为下一个周日下单,或者周二下午2点之后,你不能为第二天下单。知道我需要在5月4日星期日(截止日期)说“好”,然后让它告诉我5月2日星期五

所以我有下面的代码,它不能正常工作

int offset = (int)reqDate.DayOfWeek - thiscafeday.day_number;

DateTime cutoffDateTime = reqDate.AddDays(-offset);
其中reqDate.DayOfWeek是星期日(0),而此Cafeday.day_编号是星期五(5)。我需要星期五的约会。如果截止日期是第二天,但星期日(即星期日0)似乎会把一切都搞糟,那么截止日期时间值是正确的。我似乎经常得到正确的一天,但下个星期,而不是前一个星期(我想我们是因为负偏移)

如果有人有一个简单的方法来获取过去一周内任意一天的日期,给定当前日期,我将非常感谢您的帮助

我也尝试了不同的版本

((7- (int)reqDate.DayOfWeek + thiscafeday.day_number) % 7)
但这也不能起作用


感谢您的帮助。

您不必计算要抵消的天数,只需后退一步,直到到达您想要的位置

DateTime GetDay(DateTime startDate, DayOfWeek targetDay)
{
    var date = startDate;
    while (date.DayOfWeek != targetDay)
    {
        date = date.AddDays(-1);
    }
    return date;
}
如果还需要偏移量,可以减去之后的日期:

DateTime startDate = new DateTime(2014, 4, 27); // Sunday
DateTime friday = GetDay(startDate, DayOfWeek.Friday);
int diff = (startDate - friday).Days; // subtracting DateTimes gives a TimeSpan
Console.WriteLine(diff); // 2

您可以使用以下扩展方法:

public static class DateExtensions
{
    public static DateTime Next(this DateTime from, DayOfWeek dayOfWeek)
    {
        int start = (int)from.DayOfWeek;
        int wanted = (int)dayOfWeek;
        if (wanted <= start)
            wanted += 7;
        return from.AddDays(wanted - start);
    }

    public static DateTime Previous(this DateTime from, DayOfWeek dayOfWeek)
    {
        int end = (int)from.DayOfWeek;
        int wanted = (int)dayOfWeek;
        if (wanted >= end)
            end += 7;
        return from.AddDays(wanted - end);
    }
}


var lastFriday = DateTime.Today.Previous(DayOfWeek.Friday);
公共静态类日期扩展
{
public static DateTime Next(此DateTime from,DayOfWeek DayOfWeek)
{
int start=(int)from.DayOfWeek;
int WARNED=(int)星期一;
如果(需要=结束)
end+=7;
从.AddDays返回(通缉-结束);
}
}
var lastFriday=DateTime.Today.Previous(DayOfWeek.Friday);

(可能需要针对您的特定场景进行一些调整)

谢谢您的帮助,Tim,我已经研究了循环,虽然一定有一种“聪明而优雅”的方法来使用数字,但这次显然不是!你当然可以用数字来做。它最终是否会比一个循环更优雅、更清晰还不确定。