forked from Giannoudis/TimePeriodLibrary
-
Notifications
You must be signed in to change notification settings - Fork 0
/
QuarterTimeRange.cs
182 lines (155 loc) · 6.26 KB
/
QuarterTimeRange.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
// -- FILE ------------------------------------------------------------------
// name : QuarterTimeRange.cs
// project : Itenso Time Period
// created : Jani Giannoudis - 2011.02.18
// language : C# 4.0
// environment: .NET 2.0
// copyright : (c) 2011-2012 by Itenso GmbH, Switzerland
// --------------------------------------------------------------------------
using System;
namespace Itenso.TimePeriod
{
// ------------------------------------------------------------------------
public abstract class QuarterTimeRange : CalendarTimeRange
{
// ----------------------------------------------------------------------
protected QuarterTimeRange( int startYear, YearQuarter startQuarter, int quarterCount ) :
this( startYear, startQuarter, quarterCount, new TimeCalendar() )
{
} // QuarterTimeRange
// ----------------------------------------------------------------------
protected QuarterTimeRange( int startYear, YearQuarter startQuarter, int quarterCount, ITimeCalendar calendar ) :
base( GetPeriodOf( calendar, startYear, startQuarter, quarterCount ), calendar )
{
this.startYear = startYear;
this.startQuarter = startQuarter;
this.quarterCount = quarterCount;
TimeTool.AddQuarter( startYear, startQuarter, quarterCount - 1, out endYear, out endQuarter );
} // QuarterTimeRange
// ----------------------------------------------------------------------
public override int BaseYear
{
get { return startYear; }
} // BaseYear
// ----------------------------------------------------------------------
public int StartYear
{
get { return Calendar.GetYear( startYear, (int)Calendar.YearBaseMonth ); }
} // StartYear
// ----------------------------------------------------------------------
public int EndYear
{
get { return Calendar.GetYear( endYear, (int)Calendar.YearBaseMonth ); }
} // EndYear
// ----------------------------------------------------------------------
public YearQuarter StartQuarter
{
get { return startQuarter; }
} // StartQuarter
// ----------------------------------------------------------------------
public YearQuarter EndQuarter
{
get { return endQuarter; }
} // EndQuarter
// ----------------------------------------------------------------------
public int QuarterCount
{
get { return quarterCount; }
} // QuarterCount
// ----------------------------------------------------------------------
public string StartQuarterName
{
get { return Calendar.GetQuarterName( StartQuarter ); }
} // StartQuarterName
// ----------------------------------------------------------------------
public string StartQuarterOfYearName
{
get { return Calendar.GetQuarterOfYearName( StartYear, StartQuarter ); }
} // StartQuarterOfYearName
// ----------------------------------------------------------------------
public string EndQuarterName
{
get { return Calendar.GetQuarterName( EndQuarter ); }
} // EndQuarterName
// ----------------------------------------------------------------------
public string EndQuarterOfYearName
{
get { return Calendar.GetQuarterOfYearName( EndYear, EndQuarter ); }
} // EndQuarterOfYearName
// ----------------------------------------------------------------------
public ITimePeriodCollection GetMonths()
{
TimePeriodCollection months = new TimePeriodCollection();
for ( int i = 0; i < quarterCount; i++ )
{
for ( int month = 0; month < TimeSpec.MonthsPerQuarter; month++ )
{
int year;
YearMonth yearMonth;
TimeTool.AddMonth( startYear, YearBaseMonth, ( i * TimeSpec.MonthsPerQuarter ) + month, out year, out yearMonth );
months.Add( new Month( year, yearMonth, Calendar ) );
}
}
return months;
} // GetMonths
// ----------------------------------------------------------------------
protected override bool IsEqual( object obj )
{
return base.IsEqual( obj ) && HasSameData( obj as QuarterTimeRange );
} // IsEqual
// ----------------------------------------------------------------------
private bool HasSameData( QuarterTimeRange comp )
{
return
startYear == comp.startYear &&
startQuarter == comp.startQuarter &&
quarterCount == comp.quarterCount &&
endYear == comp.endYear &&
endQuarter == comp.endQuarter;
} // HasSameData
// ----------------------------------------------------------------------
protected override int ComputeHashCode()
{
return HashTool.ComputeHashCode( base.ComputeHashCode(), startYear, startQuarter, quarterCount, endYear, endQuarter );
} // ComputeHashCode
// ----------------------------------------------------------------------
private static DateTime GetStartOfQuarter( ITimeCalendar calendar, int year, YearQuarter quarter )
{
DateTime startOfQuarter;
switch ( calendar.YearType )
{
case YearType.FiscalYear:
startOfQuarter = FiscalCalendarTool.GetStartOfQuarter( year, quarter,
calendar.YearBaseMonth, calendar.FiscalFirstDayOfYear, calendar.FiscalYearAlignment );
break;
default:
DateTime yearStart = new DateTime( year, (int)calendar.YearBaseMonth, 1 );
startOfQuarter = yearStart.AddMonths( ( (int)quarter - 1 ) * TimeSpec.MonthsPerQuarter );
break;
}
return startOfQuarter;
} // GetStartOfQuarter
// ----------------------------------------------------------------------
private static TimeRange GetPeriodOf( ITimeCalendar calendar, int startYear, YearQuarter startQuarter, int quarterCount )
{
if ( quarterCount < 1 )
{
throw new ArgumentOutOfRangeException( "quarterCount" );
}
DateTime start = GetStartOfQuarter( calendar, startYear, startQuarter );
int endYear;
YearQuarter endQuarter;
TimeTool.AddQuarter( startYear, startQuarter, quarterCount, out endYear, out endQuarter );
DateTime end = GetStartOfQuarter( calendar, endYear, endQuarter );
return new TimeRange( start, end );
} // GetPeriodOf
// ----------------------------------------------------------------------
// members
private readonly int startYear;
private readonly YearQuarter startQuarter;
private readonly int quarterCount;
private readonly int endYear; // cache
private readonly YearQuarter endQuarter; // cache
} // class QuarterTimeRange
} // namespace Itenso.TimePeriod
// -- EOF -------------------------------------------------------------------