在C#中获取上周/下周的星期三日期
我将如何获得上周三和周三周三在C#中的日期:
public Form1() { InitializeComponent(); CurrentDate.Text = "Today's Date: " + DateTime.Now.ToString("dd/MM/yyyy"); CurrentRent.Text = "Current Rent Date: "; // last wednesday NextRent.Text = "Next Rent Date: "; // next wednesday }
要找到下周三,请继续添加天数,直至找到。 要查找上一个星期三,只需减去天数,直到找到一个。
DateTime nextWednesday = DateTime.Now.AddDays(1); while (nextWednesday.DayOfWeek != DayOfWeek.Wednesday) nextWednesday = nextWednesday.AddDays(1); DateTime lastWednesday = DateTime.Now.AddDays(-1); while (lastWednesday.DayOfWeek != DayOfWeek.Wednesday) lastWednesday = lastWednesday.AddDays(-1);
DateTime.Now.AddDays(7)
和DateTime.Now.AddDays(-7)
是你如何做算术,假设你在星期三。 如果不是,您需要做的是使用DayOfWeek
属性来确定确定哪一天是“星期三”所需的天数(正数和负数)。 然后,您可以将该值传递给AddDays
。
例如,如果今天是星期二,你将在上周三获得AddDays(-6)
AddDays(8)
,在下周三获得AddDays(8)
。
我会告诉你计算这些的任务。
使用AddDays例程:
// increment by the number of offset days to get the correct date DayOfWeek desiredDay = DayOfWeek.Wednesday; int offsetAmount = (int) desiredDay - (int) DateTime.Now.DayOfWeek; DateTime lastWeekWednesday = DateTime.Now.AddDays(-7 + offsetAmount); DateTime nextWeekWednesday = DateTime.Now.AddDays(7 + offsetAmount);
应该这样做!
注意:如果是星期一,“上周三”会给你发生的最后一个星期三,但是“下周三”会给你9天后的星期三! 如果您希望在两天内获得星期三,则需要使用“%”运算符。 这意味着第二个“nextweek”语句将显示为“(7 + offsetAmount)%7”。
您可以使用它来计算它:
DateTime day = DateTime.Today; while (day.DayOfWeek != DayOfWeek.Wednesday) day = day.AddDays(-1); var currentRent = day; var nextRent = day.AddDays(7);
请注意,如果今天是星期三,这将显示currentRent
为今天,而不是今天的nextRent
。 如果你想要反转,你可以颠倒逻辑。
DateTime day = DateTime.Today; while (day.DayOfWeek != DayOfWeek.Wednesday) day = day.AddDays(1); var currentRent = day.AddDays(-7); var nextRent = day;
您将要使用DayOfWeek
枚举以及switch语句的if-else结构来确定添加/减去日期的天数。 这是繁琐的编码,但很简单。
DateTime nextRent; DateTime lastRent; DateTime today = DateTime.Now; if (today.DayOfWeek == DayOfWeek.Wednesday) { nextRent = today.AddDays(7); lastRent = today.AddDays(-7); } else if (today.DayOfWeek == DayOfWeek.Thursday) { nextRent = today.AddDays(6); lastRent = today.AddDays(-8); } //ect for all days
这会奏效。 您需要计算您提供的日期与最近的星期三之间的天数差异,并根据差异是否大于零来计算上一个/下一个星期三。
int difference = date.DayOfWeek - DayOfWeek.Wednesday; DateTime lastWednesday = difference > 0 ? date.AddDays(-1 * difference) : date.AddDays(-1 * (7 + difference)); DateTime nextWednesday = lastWednesday.AddDays(7);
改进了Servy的答案。 您需要将whileWednesday或lastWednesday日期实际设置为while循环中的新日期,否则它将进入无限循环
DateTime nextWednesday = DateTime.Now.AddDays(1); while (nextWednesday.DayOfWeek != DayOfWeek.Wednesday) nextWednesday = nextWednesday.AddDays(1); DateTime lastWednesday = DateTime.Now.AddDays(-1); while (lastWednesday.DayOfWeek != DayOfWeek.Wednesday) lastWelastWednesday.AddDays(-1);
您可以创建2个DateTime扩展方法,可以与DayOfWeek参数一起使用:
public static class DateTimeExtension { public static DateTime GetPreviousWeekDay(this DateTime currentDate, DayOfWeek dow) { int currentDay = (int)currentDate.DayOfWeek, gotoDay = (int)dow; return currentDate.AddDays(-7).AddDays(gotoDay-currentDay); } public static DateTime GetNextWeekDay(this DateTime currentDate, DayOfWeek dow) { int currentDay = (int)currentDate.DayOfWeek, gotoDay = (int)dow; return currentDate.AddDays(7).AddDays(gotoDay - currentDay); } }
然后可以使用以下内容:
DateTime testDate = new DateTime(2017, 01, 21); Console.WriteLine(testDate.GetPreviousWeekDay(DayOfWeek.Wednesday)); Console.WriteLine(testDate.GetNextWeekDay(DayOfWeek.Wednesday));
private static DateTime FindPreviousDayOfWeek(DateTime fromDate, DayOfWeek findDay, bool skipSame = false) { if (fromDate.DayOfWeek < findDay) fromDate = fromDate.AddDays(-((int)fromDate.DayOfWeek - 1 + (int)findDay)); else if (fromDate.DayOfWeek > findDay) fromDate = fromDate.AddDays(-((int)fromDate.DayOfWeek - (int)findDay)); else if (fromDate.DayOfWeek == findDay && skipSame == true) fromDate = fromDate.AddDays(-7); return fromDate; }
如果将saem作为所需日期,则skipSame变量不包括当前日期。
这是一个完成相同的单线程。 了解它实际上是如何工作有点令人难以置信但它确实如此:
下周三:
dt.AddDays(-(int)(dt.AddDays(-4).DayOfWeek) + 6);
上周三
dt.AddDays(-(int)(dt.AddDays(-3).DayOfWeek));
在这两种情况下,它将在星期三返回当天。 这适用于任何工作日,只需调整AddDays()调用中的数字即可。 例如星期五:
下周五
dt.AddDays(-(int)(dt.AddDays(-6).DayOfWeek) + 6);
上周五
dt.AddDays(-(int)(dt.AddDays(-5).DayOfWeek));