Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

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

Posted on 2015-01-20
16
Medium Priority
?
57 Views
Last Modified: 2015-01-27
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
0
Comment
Question by:Andy Green
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 4
  • 4
  • +2
16 Comments
 
LVL 52

Accepted Solution

by:
Carl Tawn earned 1800 total points
ID: 40559484
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)
);

Open in new window

0
 
LVL 11

Assisted Solution

by:louisfr
louisfr earned 200 total points
ID: 40559511
Just a little correction:
int interval = (today.Day - 1) / 7 + 1;

Open in new window

January 7th was the first Wednesday, not the second.
0
 
LVL 52

Expert Comment

by:Carl Tawn
ID: 40559516
Good spot :)
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
LVL 83

Expert Comment

by:David Johnson, CD, MVP
ID: 40559523
same idea but different
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

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));
                 Console.ReadLine();                                         
        }
    }
}

Open in new window

0
 
LVL 52

Expert Comment

by:Carl Tawn
ID: 40559542
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
 
LVL 86

Expert Comment

by:Mike Tomlinson
ID: 40560024
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)
            {
                dt = dt.AddDays(-1);
                if (dt.DayOfWeek == day)
                {
                    count++;
                }
            }
            string[] suffix = { "", "st", "nd", "rd", "th", "th" };
            return count.ToString() + suffix[count] + " " + day.ToString();
        }

Open in new window

0
 
LVL 11

Expert Comment

by:louisfr
ID: 40560045
Mindless indeed. I think I once used LINQ for this kind of computation, as a proof of concept.
0
 
LVL 86

Expert Comment

by:Mike Tomlinson
ID: 40560089
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++;
                dt = dt.AddDays(-7);
            }
            return count.ToString() + suffix[count - 1] + " " + dt.DayOfWeek.ToString();
        }

Open in new window

0
 
LVL 11

Expert Comment

by:louisfr
ID: 40560114
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;
}

Open in new window

0
 
LVL 86

Expert Comment

by:Mike Tomlinson
ID: 40560154
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
 
LVL 3

Author Comment

by:Andy Green
ID: 40562188
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
 
LVL 3

Author Comment

by:Andy Green
ID: 40562196
Actually ignore that - I had removed the +1 for debugging. I'll post some other discrepancies in a bit.

Andy
0
 
LVL 3

Author Comment

by:Andy Green
ID: 40562205
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
 
LVL 52

Assisted Solution

by:Carl Tawn
Carl Tawn earned 1800 total points
ID: 40562261
Looks like i missed the offset. This line:
int interval = (today.Day / 7) + 1;

Open in new window

Should be:
int interval = ((today.Day-1) / 7) + 1;

Open in new window

Which gives:
Output
0
 
LVL 11

Expert Comment

by:louisfr
ID: 40562304
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

Open in new window

0
 
LVL 3

Author Closing Comment

by:Andy Green
ID: 40572496
Thank guys, sorry I give point all round. to be fair I have used Carls first solution.

Andy
0

Featured Post

Free Backup Tool for VMware and Hyper-V

Restore full virtual machine or individual guest files from 19 common file systems directly from the backup file. Schedule VM backups with PowerShell scripts. Set desired time, lean back and let the script to notify you via email upon completion.  

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

For those of you who don't follow the news, or just happen to live under rocks, Microsoft Research released a beta SDK (http://www.microsoft.com/en-us/download/details.aspx?id=27876) for the Xbox 360 Kinect. If you don't know what a Kinect is (http:…
Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…
Sometimes it takes a new vantage point, apart from our everyday security practices, to truly see our Active Directory (AD) vulnerabilities. We get used to implementing the same techniques and checking the same areas for a breach. This pattern can re…
Want to learn how to record your desktop screen without having to use an outside camera. Click on this video and learn how to use the cool google extension called "Screencastify"! Step 1: Open a new google tab Step 2: Go to the left hand upper corn…

722 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question