private DateTime GetVariableHoliday(HolidayConfiguration holidayConfiguration, int year) { var occurrenceFormat = holidayConfiguration.Occurrence.Split('|'); int month = int.Parse(occurrenceFormat[0]); DayOfWeek dayOfWeek = DayOfWeek.Monday; int occurrence = int.Parse(occurrenceFormat[2]); return(Enumerable.Range(1, 7) .Select(day => new DateTime(year, month, day)) .First(dateTime => (dateTime.DayOfWeek == dayOfWeek)) .AddDays(7 * (occurrence - 1))); }
private DateTime GetFixedHoliday(HolidayConfiguration holidayConfiguration, int year) { var holidayDate = DateTime.ParseExact($"{holidayConfiguration.DayMonth}/{year}", "d/M/yyyy", CultureInfo.InvariantCulture); if (holidayConfiguration.IsObserved) { if (holidayDate.DayOfWeek == DayOfWeek.Saturday) { holidayDate = holidayDate.AddDays(2); } else if (holidayDate.DayOfWeek == DayOfWeek.Sunday) { holidayDate = holidayDate.AddDays(1); } } return(holidayDate); }
private DateTime GetHoliday(HolidayConfiguration holidayConfiguration, int year) { if (!Utility.IsValidHolidayConfig(holidayConfiguration)) { throw new InvalidOperationException("Invalid holiday configurations"); } var holidayDate = new DateTime(); if (!string.IsNullOrEmpty(holidayConfiguration.DayMonth)) { holidayDate = GetFixedHoliday(holidayConfiguration, year); } else if (!string.IsNullOrEmpty(holidayConfiguration.Occurrence)) { holidayDate = GetVariableHoliday(holidayConfiguration, year); } return(holidayDate); }
public static bool IsValidHolidayConfig(HolidayConfiguration holidayConfiguration) { if (holidayConfiguration == null) { return(false); } else if (!string.IsNullOrEmpty(holidayConfiguration.DayMonth)) { return(DateTime.TryParseExact($"{holidayConfiguration.DayMonth}/2020", "d/M/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime _)); } else if (string.IsNullOrEmpty(holidayConfiguration.Occurrence)) { return(false); } else if (!string.IsNullOrEmpty(holidayConfiguration.Occurrence)) { return(holidayConfiguration.Occurrence.Split('|').Length == 3); } return(true); }