2012-05-03 8 views
5

Ich muss erkennen, wenn der aktuelle Tag der dritte Freitag im letzten Monat des Quartals ist.Detecting der dritte Freitag im letzten Monat des Quartals

Für das Jahr 2012 das wäre diese vier Daten sein:

  • 2012-03-16
  • 2012-06-15
  • 2012-09-21
  • 2012-12-21

Was ist ein guter Weg, dies in C# zu tun?

+0

mögliches Duplikat von [Wie berechnet man den 2. Freitag des Monats in C#] (http://stackoverflow.com/questions/6140018/how-to-calculate-2nd-friday-of-month-in-c-sharp) –

+1

möglich Duplikat von [Wie finde ich den 3. Freitag in einem Monat mit C#?] (http://stackoverflow.com/questions/5421972/how-to-find-the-3rd-friday-in-a-month-with-c) – Stefan

+0

Also wenn das Datum ist 2012-06-15 ist das ein Spiel? Oder ist es 2012-05-18 (Monat vor Ende) das wäre das Spiel? – mattytommo

Antwort

1

Nun können Sie mit dem ersten Tag des Monats und Voraus beginnen, bis Sie den ersten Freitag finden, eine Anzeige, die Sie 14 Tage hinzufügen können am dritten Freitag ankommen

2

Oder Sie ohne Schleifen gehen und einfach nehmen heute 3. Freitag ist und finden sie, welcher Tag es war vor 2 Wochen (sollte Freitag im gleichen Monat für positive Begegnung):

var now = DateTime.UtcNow; 
var firstFriday = now.AddDays(-14); 
return now.Month % 3 == 0 
    && firstFriday.DayOfWeek == DaysOfWeek.Friday 
    && now.Month == firstFriday.Month; 
+1

Es kann bis zu fünf Freitage in einem Monat geben. Eine Möglichkeit der Überprüfung besteht darin, eine Überprüfung hinzuzufügen, dass now.AddDays (-21) nicht derselbe Monat ist. –

0

mit der Erweiterung Methode geschrieben von Bert Smith in This Answer Hier wird die Methode IsThirdFridayInLastMonthOfQuarter Die wird genau das tun, was Sie aussehen ing für:

public static class DateHelper 
{ 
    public static DateTime NthOf(this DateTime CurDate, int Occurrence, DayOfWeek Day) 
    { 
     var fday = new DateTime(CurDate.Year, CurDate.Month, 1); 

     var fOc = fday.DayOfWeek == Day ? fday : fday.AddDays(Day - fday.DayOfWeek); 
     // CurDate = 2011.10.1 Occurance = 1, Day = Friday >> 2011.09.30 FIX. 
     if (fOc.Month < CurDate.Month) Occurrence = Occurrence + 1; 
     return fOc.AddDays(7 * (Occurrence - 1)); 
    } 

    public static bool IsThirdFridayInLastMonthOfQuarter(DateTime date) 
    { 
     // quarter ends 
     int[] months = new int[] { 3, 6, 9, 12 }; 

     // if the date is not in the targeted months, return false. 
     if (!months.Contains(date.Month)) 
      return false; 

     // get the date of third friday in month 
     DateTime thirdFriday = date.NthOf(3, DayOfWeek.Friday); 

     // check if the date matches and return boolean 
     return date.Date == thirdFriday.Date; 
    } 
} 

es zu benutzen:

bool isThirdFriday = DateHelper.IsThirdFridayInLastMonthOfQuarter(date); 
0

Sie können die Verwendung Time Period Library for .NET:

// ---------------------------------------------------------------------- 
public DateTime? GetDayOfLastQuarterMonth(DayOfWeek dayOfWeek, int count) 
{ 
    Quarter quarter = new Quarter(); 
    Month lastMonthOfQuarter = new Month(quarter.End.Date); 

    DateTime? searchDay = null; 
    foreach (Day day in lastMonthOfQuarter.GetDays()) 
    { 
    if (day.DayOfWeek == dayOfWeek) 
    { 
     count--; 
     if (count == 0) 
     { 
     searchDay = day.Start.Date; 
     break; 
     } 
    } 
    } 
    return searchDay; 
} // GetDayOfLastQuarterMonth 

Jetzt tun Sie Ihren Scheck:

// ---------------------------------------------------------------------- 
public void CheckDayOfLastQuarterMonth() 
{ 
    DateTime? day = GetDayOfLastQuarterMonth(DayOfWeek.Friday, 3); 
    if (day.HasValue && day.Equals(DateTime.Now.Date)) 
    { 
    // do ... 
    } 
} // CheckDayOfLastQuarterMonth 
0
// Do a few cheap checks and ensure that current month is the last month of 
// quarter before computing the third friday of month 
if (Cur.DayOfWeek == DayOfWeek.Friday && Cur.Day > 14 && Cur.Month % 3 == 0) { 
    var Friday = new DateTime(Cur.Year, Cur.Month, 15); 
     Friday = Friday.AddDays((5 - (int)Friday.DayOfWeek + 7) % 7); 
    if (Cur.Day == Friday.Day) 
     return true; 
} 
Verwandte Themen