给定DayOfWeek编号,找到前一周的一天的日期

时间:2014-04-28 15:30:19

标签: c# datetime

这可能很简单,但我有一个“不能做基本数学”的那一天。

我有一个系统,我们根据它的日期切断订单,所以例如在星期五下午4点之后你不能订购下周日,或者在星期二下午2点之后你不能订购第二天。知道我需要说好,我需要一个产品在5月4日星期日,截止时间,并告诉我它是5月2日星期五。

所以我有以下代码无法正常工作

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

DateTime cutoffDateTime = reqDate.AddDays(-offset);

其中reqDate.DayOfWeek是星期日(0)而thiscafeday.day_number是星期五(5)。我需要星期五的约会。如果截止日期是第二天,则cutoffDateTime值是正确的,但是星期日(DayOfWeek 0)似乎弄乱了所有内容。我似乎经常得到正确的一天,但下一个一周,而不是之前的那个(我猜我们是因为负偏移)。

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

我也尝试了

的变体
((7- (int)reqDate.DayOfWeek + thiscafeday.day_number) % 7)

但也无法让它发挥作用。

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:1)

不要试图计算要抵消的天数,而只需向后退一步,直到你想要去的地方为止。

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

答案 1 :(得分:1)

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

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);

(可能需要针对您的具体情况进行一些调整)