using System; using System.Globalization; public struct WeekAndYear { public int Week { get; private set; } public int Year { get; private set; } public WeekAndYear(int week, int year) : this() { Week = week; Year = year; } public DateTime StartDate { get { DateTime jan1 = new DateTime(Year, 1, 1); int day = (int)jan1.DayOfWeek - 1; int delta = (day < 4 ? -day : 7 - day) + 7 * (Week - 1); return jan1.AddDays(delta); } } public static WeekAndYear operator ++(WeekAndYear value) { if (value.Week >= 52) { // December 28th is always in the last week of a year when using ISO week-numbering Calendar cal = CultureInfo.CurrentCulture.Calendar; int lastWeekOfYear = cal.GetWeekOfYear(new DateTime(value.Year, 12, 28), CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); if (value.Week >= lastWeekOfYear) return new WeekAndYear() { Week = 1, Year = value.Year + 1 }; } return new WeekAndYear() { Week = value.Week + 1, Year = value.Year }; } public static WeekAndYear operator --(WeekAndYear value) { if (value.Week == 1) { // December 28th is always in the last week of a year when using ISO week-numbering Calendar cal = CultureInfo.CurrentCulture.Calendar; int lastWeekOfYear = cal.GetWeekOfYear(new DateTime(value.Year - 1, 12, 28), CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); return new WeekAndYear(lastWeekOfYear, value.Year - 1); } return new WeekAndYear(value.Week - 1, value.Year); } public static bool operator >(WeekAndYear v1, WeekAndYear v2) { if (v1.Year == v2.Year) return v1.Week > v2.Week; else return v1.Year > v2.Year; } public static bool operator <(WeekAndYear v1, WeekAndYear v2) { return v2 > v1; } public override string ToString() { return String.Format("W{0:D2} {1}", Week, Year); } /// /// Construct a WeekAndYear from any date (returning the week this date falls into). /// Corrects year number in case of W53 dates in January. /// public static WeekAndYear FromDate(DateTime date) { WeekAndYear result = new WeekAndYear(); result.Year = date.Year; result.Week = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); // If the date in January falls into the last week of the previous // year, decrement the year extracted from the DateTime if (result.Week >= 52 && date.DayOfYear <= 3) result.Year--; return result; } }