Here is the code to get the Current Quarter End for a Given FYE Date: 1: public static DateTime ThisQuarterEnd(this DateTime date, DateTime fyeDate)
2: {
3: IEnumerable<DateTime> candidates =
4: QuartersInYear(date.Year, fyeDate.Month).Union(QuartersInYear(date.Year + 1, fyeDate.Month));
5: return candidates.Where(d => d.Subtract(date).Days >= 0).First();
6: }
7:
8: public static IEnumerable<DateTime> QuartersInYear(int year, int q4Month)
9: {
10: int q1Month = 3, q2Month = 6, q3Month = 9;
11: int q1year = year, q2year = year, q3year = year;
12: int q1Day = 31, q2Day = 31, q3Day = 31, q4Day = 31;
13:
14:
15: q3Month = q4Month - 3;
16: if (q3Month <= 0)
17: {
18: q3Month = q3Month + 12;
19: q3year = year - 1;
20: }
21: q2Month = q4Month - 6;
22: if (q2Month <= 0)
23: {
24: q2Month = q2Month + 12;
25: q2year = year - 1;
26: }
27: q1Month = q4Month - 9;
28: if (q1Month <= 0)
29: {
30: q1Month = q1Month + 12;
31: q1year = year - 1;
32: }
33:
34: q1Day = new DateTime(q1year, q1Month, 1).AddMonths(1).AddDays(-1).Day;
35: q2Day = new DateTime(q2year, q2Month, 1).AddMonths(1).AddDays(-1).Day;
36: q3Day = new DateTime(q3year, q3Month, 1).AddMonths(1).AddDays(-1).Day;
37: q4Day = new DateTime(year, q4Month, 1).AddMonths(1).AddDays(-1).Day;
38:
39: return new List<DateTime>() {
40: new DateTime(q1year, q1Month, q1Day),
41: new DateTime(q2year, q2Month, q2Day),
42: new DateTime(q3year, q3Month, q3Day),
43: new DateTime(year, q4Month, q4Day),
44: };
45:
46: }
The code to get the NextQuarterEnd is simple, just Change the Where clause to read d.Subtract(date).Days > 0 instead of d.Subtract(date).Days >= 0
1: public static DateTime NextQuarterEnd(this DateTime date, DateTime fyeDate)
2: {
3: IEnumerable<DateTime> candidates =
4: QuartersInYear(date.Year, fyeDate.Month).Union(QuartersInYear(date.Year + 1, fyeDate.Month));
5: return candidates.Where(d => d.Subtract(date).Days > 0).First();
6: }
Also if you need to get the Quarter Label for a given Date, given a particular FYE date then following is the code to use:
1: public static string GetQuarterLabel(this DateTime date, DateTime fyeDate)
2: {
3: int q1Month = fyeDate.Month - 9, q2Month = fyeDate.Month - 6, q3Month = fyeDate.Month - 3;
4:
5: int year = date.Year, q1Year = date.Year, q2Year = date.Year, q3Year = date.Year;
6:
7: if (q1Month <= 0)
8: {
9: q1Month += 12;
10: q1Year = year + 1;
11: }
12: if (q2Month <= 0)
13: {
14: q2Month += 12;
15: q2Year = year + 1;
16: }
17: if (q3Month <= 0)
18: {
19: q3Month += 12;
20: q3Year = year + 1;
21: }
22:
23: string qtr = "";
24: if (date.Month == q1Month)
25: {
26: qtr = "Qtr1";
27: year = q1Year;
28: }
29: else if (date.Month == q2Month)
30: {
31: qtr = "Qtr2";
32: year = q2Year;
33: }
34: else if (date.Month == q3Month)
35: {
36: qtr = "Qtr3";
37: year = q3Year;
38: }
39: else if (date.Month == fyeDate.Month)
40: {
41: qtr = "Qtr4";
42: year = date.Year;
43: }
44:
45: return string.Format("{0} - {1}", qtr, year.ToString());
46: }