For a project I needed to figure the dates of first and last day of the week, month, quarter
and year for a given date.
The first thing we need to do is define an Enum of Frequency types
public enum FrequencyType
{
None = 0,
Daily = 1,
Weekly = 2,
Monthly = 3,
Quarterly = 4,
Annually = 5,
}
The actual procedure get the target date and frequency type, it returns an array of string containing the first and last date. The procedure returns an array of string that contains the first date and the last date of the given frequency.
private string[] GetRange(FrequencyType frequency, DateTime dateToCheck)
{
string[] result = new string [2];
DateTime dateRangeBegin = dateToCheck;
TimeSpan duration = new TimeSpan(0, 0, 0, 0); //One day
DateTime dateRangeEnd = DateTime.Today.Add(duration);
switch (frequency)
{
case FrequencyType.Daily:
dateRangeBegin = dateToCheck;
dateRangeEnd = dateRangeBegin;
break;
case FrequencyType.Weekly:
dateRangeBegin = dateToCheck.AddDays(-(int)dateToCheck.DayOfWeek);
dateRangeEnd = dateToCheck.AddDays(6 - (int)dateToCheck.DayOfWeek);
break;
case FrequencyType.Monthly:
duration = new TimeSpan(DateTime.DaysInMonth ( dateToCheck.Year, dateToCheck.Month) - 1 , 0, 0, 0);
dateRangeBegin = dateToCheck.AddDays((-1) * dateToCheck.Day + 1);
dateRangeEnd = dateRangeBegin.Add(duration);
break;
case FrequencyType.Quarterly:
int currentQuater = (dateToCheck.Date.Month - 1) / 3 + 1;
int daysInLastMonthOfQuarter = DateTime.DaysInMonth(dateToCheck.Year, 3 * currentQuater );
dateRangeBegin = new DateTime ( dateToCheck.Year, 3 * currentQuater - 2, 1);
dateRangeEnd = new DateTime(dateToCheck.Year, 3 * currentQuater , daysInLastMonthOfQuarter);
break;
case FrequencyType.Annually:
dateRangeBegin = new DateTime(dateToCheck.Year, 1, 1);
dateRangeEnd = new DateTime(dateToCheck.Year, 12, 31);
break;
}
result[0] = dateRangeBegin.Date.ToString();
result[1] = dateRangeEnd.Date.ToString();
return result;
}
To test the function we can write a test method.
//Test Data
private void GetDateRanges()
{
string[] dates;
StringBuilder result = new StringBuilder("");
dates = this.GetRange(FrequencyType.Daily, DateTime.Today); //Or any any other date you want to test.
result.AppendLine(string.Format("Daily Range : {0} - {1}", dates[0], dates[1]));
dates = this.GetRange(FrequencyType.Weekly, DateTime.Today);
result.AppendLine(string.Format("Weekly Range : {0} - {1}", dates[0], dates[1]));
dates = this.GetRange(FrequencyType.Monthly, DateTime.Today);
result.AppendLine(string.Format("Monthly Range : {0} - {1}", dates[0], dates[1]));
dates = this.GetRange(FrequencyType.Quarterly, DateTime.Today);
result.AppendLine(string.Format("Quarterly Range : {0} - {1}", dates[0], dates[1]));
dates = this.GetRange(FrequencyType.Annually, DateTime.Today);
result.AppendLine(string.Format("Annually Range : {0} - {1}", dates[0], dates[1]));
MessageBox.Show(result.ToString());
}
View comments