# How to calculate which day of month a given day is.

Hi All

Not a very good title, but what I need is to calculate out the interval and week day of any given date.

ie today is the 3rd Tuesday.

Need to do this in ASP.net V4

Andy
LVL 3
###### Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Systems and Integration DeveloperCommented:
Try:
``````DateTime today = DateTime.Today;

DayOfWeek day = today.DayOfWeek;
int interval = (today.Day / 7) + 1;

string suffix = "th";
if (interval == 1)
suffix = "st";
else if (interval == 2)
suffix = "nd";
else if (interval == 3)
suffix = "rd";

Console.Write("Today is the {0}{1} {2} of the month",
interval,
suffix,
Enum.GetName(typeof(DayOfWeek), day)
);
``````
0

Experts Exchange Solution brought to you by

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Commented:
Just a little correction:
``````int interval = (today.Day - 1) / 7 + 1;
``````
January 7th was the first Wednesday, not the second.
0
Systems and Integration DeveloperCommented:
Good spot :)
0
OwnerCommented:
same idea but different
``````using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication34
{
class Program
{
static void Main(string[] args)
{
DateTime today = DateTime.Today;

DayOfWeek day = today.DayOfWeek;
int interval = (today.Day - 1) / 7 + 1;
string suffix;
switch (interval)
{
case 1:
suffix = "th";
break;
case 2:
suffix = "st";
break;
case 3:
suffix = "rd";
break;
default:
suffix = "th";
break;
}
Console.WriteLine("Today is the {0}{1} {2} of the month", interval,suffix,Enum.GetName(typeof(DayOfWeek), day));
}
}
}
``````
0
Systems and Integration DeveloperCommented:
I did think about putting a switch in there, but it didn't seem worth it for 3 values.  I also toyed with an extension method, which for repeated use would be handy, but a bit overkill for a quick example.
0
Middle School Assistant TeacherCommented:
I like those answers.  Here's a mindless approach that simply iterates backwards to the 1st of the month and counts the number of days that match the one passed in:
``````        public string DayInterval(DateTime dt)
{
int count = 1;
DayOfWeek day = dt.DayOfWeek;
while(dt.Day != 1)
{
if (dt.DayOfWeek == day)
{
count++;
}
}
string[] suffix = { "", "st", "nd", "rd", "th", "th" };
return count.ToString() + suffix[count] + " " + day.ToString();
}
``````
0
Commented:
Mindless indeed. I think I once used LINQ for this kind of computation, as a proof of concept.
0
Middle School Assistant TeacherCommented:
Here's one with ~slightly~ more thought put into it...but still without doing a straight calculation.  More coffee is required before I can do more "complex" math.  ;)
``````        private string[] suffix = {"st", "nd", "rd", "th", "th" };

public string DayInterval(DateTime dt)
{
int count = 1;
while(dt.Day > 7)
{
count++;
}
return count.ToString() + suffix[count - 1] + " " + dt.DayOfWeek.ToString();
}
``````
0
Commented:
Is this a challenge?
``````public string DayInterval(DateTime dt)
{
var days = from d in Enumerable.Range(1, dt.Day)
where new DateTime(dt.Year, dt.Month, d).DayOfWeek == dt.DayOfWeek
select d;
return days.Count() + suffix[count - 1] + " " + dt.DayOfWeek;
}
``````
0
Middle School Assistant TeacherCommented:
I Love It!  Some great answers in here now (and some not so great; *mine).  Does this mean we have to go back to "real" work now?
0
Author Commented:
Thanks guys, Carl I have integrates yours into my code and it fails sometimes, ie it says that the 23 feb 2015 is the 3rd Monday, where it is the 4th.

I'll continue with the other solutions.

Andy
0
Author Commented:
Actually ignore that - I had removed the +1 for debugging. I'll post some other discrepancies in a bit.

Andy
0
Author Commented:
Not detecting Sundays at all
17 Feb is 3rd Tues with is correct but the 18 is the 4th Wed 19 is 4th Thurs 20 is 4th Fri which are all wrong.

Here is my code have I used it correctly?

Dim today As DateTime = CType(rtpSlotStart.SelectedDate, DateTime)
Dim day As DayOfWeek = today.DayOfWeek - 1
Dim interval As Integer = ((today.Day) / 7) + 1

ddlMonthDayInterval.SelectedValue = interval
ddlMonthDay.SelectedValue = Weekday(rtpSlotStart.SelectedDate) - 1 (used as my days start at 0 not 1)

ANdy
0
Systems and Integration DeveloperCommented:
Looks like i missed the offset. This line:
``````int interval = (today.Day / 7) + 1;
``````
Should be:
``````int interval = ((today.Day-1) / 7) + 1;
``````
Which gives:
0
Commented:
The code Carl provided uses integer divisions.
Your VB code uses floating-point divisions and rounds the result.
Use the integer division operator (and subtract 1 because days start at 1):
``````Dim interval As Integer = (today.Day - 1) \ 7 + 1
``````
0
Author Commented:
Thank guys, sorry I give point all round. to be fair I have used Carls first solution.

Andy
0
###### It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
ASP.NET

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.