How to find the 3rd Friday in a month with C#?

后端 未结 19 1026
野的像风
野的像风 2020-11-27 06:07

Given a date (of type DateTime), how do I find the 3rd Friday in the month of that date?

19条回答
  •  被撕碎了的回忆
    2020-11-27 06:55

    Probably best to abstract this to a method to do any date/day combination:

    (Extension Method)

    public static bool TryGetDayOfMonth(this DateTime instance, 
                                     DayOfWeek dayOfWeek, 
                                     int occurance, 
                                     out DateTime dateOfMonth)
    {
        if (instance == null)
        {
            throw new ArgumentNullException("instance");
        }
    
        if (occurance <= 0 || occurance > 5)
        {
            throw new ArgumentOutOfRangeException("occurance", "Occurance must be greater than zero and less than 6.");
        }
    
        bool result;
        dateOfMonth = new DateTime();
    
        // Change to first day of the month
        DateTime dayOfMonth = instance.AddDays(1 - instance.Day);
    
        // Find first dayOfWeek of this month;
        if (dayOfMonth.DayOfWeek > dayOfWeek)
        {
            dayOfMonth = dayOfMonth.AddDays(7 - (int)dayOfMonth.DayOfWeek + (int)dayOfWeek);
        }
        else
        {
            dayOfMonth = dayOfMonth.AddDays((int)dayOfWeek - (int)dayOfMonth.DayOfWeek);
        }
    
        // add 7 days per occurance
        dayOfMonth = dayOfMonth.AddDays(7 * (occurance - 1));
    
        // make sure this occurance is within the original month
        result = dayOfMonth.Month == instance.Month;
    
    
        if (result)
        {
            dateOfMonth = dayOfMonth;
        }
    
        return result;
    }
    

    Results:

    DateTime myDate = new DateTime(2013, 1, 1)
    DateTime dateOfMonth;
    
    myDate.TryGetDayOfMonth(DayOfWeek.Sunday, 1, out dateOfMonth) 
    // returns: true; dateOfMonth = Sunday, 1/6/2013
    
    myDate.TryGetDayOfMonth(DayOfWeek.Sunday, 4, out dateOfMonth) 
    // returns: true; dateOfMonth = Sunday, 1/27/2013
    
    myDate.TryGetDayOfMonth(DayOfWeek.Sunday, 5, out dateOfMonth) 
    // returns: false; 
    
    myDate.TryGetDayOfMonth(DayOfWeek.Wednesday, 1, out dateOfMonth) 
    // returns: true; dateOfMonth = Wednesday, 1/2/2013
    
    myDate.TryGetDayOfMonth(DayOfWeek.Wednesday, 4, out dateOfMonth) 
    // returns: true; dateOfMonth = Wednesday, 1/23/2013
    
    myDate.TryGetDayOfMonth(DayOfWeek.Wednesday, 5, out dateOfMonth) 
    // returns: true; dateOfMonth = Wednesday, 1/30/2013 
    
    // etc
    

提交回复
热议问题