How would I get last week Wednesday and next week Wednesday\'s date in C#:
public Form1()
{
InitializeComponent();
CurrentDate.Text = \"Today\'s Date: \" +
You could create 2 DateTime Extension methods, that can be used with a DayOfWeek parameter:
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);
}
}
Which can then be used as follows:
DateTime testDate = new DateTime(2017, 01, 21);
Console.WriteLine(testDate.GetPreviousWeekDay(DayOfWeek.Wednesday));
Console.WriteLine(testDate.GetNextWeekDay(DayOfWeek.Wednesday));
This will work. You need to calculate the difference in days between your provided date and the nearest Wednesday, and calculate last/next Wednesday based on whether or not the difference is greater than zero.
int difference = date.DayOfWeek - DayOfWeek.Wednesday;
DateTime lastWednesday = difference > 0 ? date.AddDays(-1 * difference) : date.AddDays(-1 * (7 + difference));
DateTime nextWednesday = lastWednesday.AddDays(7);
Improved answer from Servy. You need to actually set the nextWednesday or lastWednesday dates to the new date in the while loop, otherwise it goes into an infinite loop
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);
You'll want to use the DayOfWeek
enum along with an if-else structure of switch statement to determine how many days to add/subtract for your dates. It's tedious coding but simple.
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
this extension method should do the trick for whatever dayofweek
public static class DateTimeExtensions
{
public static DateTime LastDayOfWeek(this DateTime _date, DayOfWeek dayofweek)
{
return _date.AddDays(-1 * ((_date.DayOfWeek - dayofweek) % 7)).Date;
}
public static DateTime NextDayOfWeek(this DateTime _date, DayOfWeek dayofweek)
{
return _date.LastDayOfWeek(dayofweek).AddDays(7).Date;
}
}
usage
var lastWendsday = DateTime.Now.LastDayOfWeek(DayOfWeek.Wednesday);
Use the AddDays routine:
// 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);
That should do it!
NOTE: If it is a Monday, "Last Wednesday" is going to give you the very last Wednesday that occurred, but "Next Wednesday" is going to give you the Wednesday 9 days from now! If you wanted to get the Wednesday in two days instead you would need to use the "%" operator. That means the second "nextweek" statement would read "(7 + offsetAmount) % 7".