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: }