ISO Week Number by Date and Date of first day of week by ISO Week Number.
I v seen a code I took as a base in several locations:
source 1,
source 2. I have no idea who is primary - I post them both.
Class implements interesting functionality:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
namespace ValidationLog
{
class DateUtils
{
public static DateTime FirstDateOfWeek(string week_format_1)
{
Int32 week_key = 0;
if (week_format_1.Trim().Length != 6 || !Int32.TryParse(week_format_1, out week_key))
{
throw new ArgumentException(String.Format("'{0}' is invalid week format",week_format_1));
}
int year = week_key / 100;
int weekOfYear = week_key % 100;
return FirstDateOfWeek(year,weekOfYear);
}
public static string WeekId(DateTime date)
{
int wk = 0;
int year = 0;
DateUtils.GetWeekNumber(date, out year, out wk);
return String.Format("{0}_{1:00}", year, wk);
}
public static DateTime FirstDateOfWeek(int year, int weekOfYear)
{
DateTime jan1 = new DateTime(year, 1, 1);
int daysOffset = (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek - (int)jan1.DayOfWeek;
DateTime firstMonday = jan1.AddDays(daysOffset);
int firstWeek = CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(jan1, CultureInfo.InvariantCulture.DateTimeFormat.CalendarWeekRule, CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek);
if (firstWeek <= 1)
{
weekOfYear -= 1;
}
return firstMonday.AddDays(weekOfYear * 7);
}
public static void GetWeekNumber(DateTime date, out int year, out int wk)
{
year = date.Year;
DateTime startOfYear = new DateTime(year, 1, 1);
DateTime endOfYear = new DateTime(year, 12, 31);
int[] iso8601Correction = { 6, 7, 8, 9, 10, 4, 5 };
int nds = date.Subtract(startOfYear).Days + iso8601Correction[(int)startOfYear.DayOfWeek];
wk = nds / 7;
switch (wk)
{
case 0:
GetWeekNumber(startOfYear.AddDays(-1), out year, out wk);
break;
case 53:
if (endOfYear.DayOfWeek < DayOfWeek.Thursday)
{
wk = 1; year += 1;
}
break;
default:
break;
}
}
}
}
Code usage:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ValidationLog;
namespace ConsoleApplication2010Lab
{
class Program
{
static void Main(string[] args)
{
DateTime endDate = new DateTime(2013,1,8);
DateTime startDate = new DateTime(2010,12,27);
for (DateTime date = startDate; date < endDate; date = date.AddDays(7))
{
Console.WriteLine("{0} - {1}", DateUtils.WeekId(date), date);
}
Console.ReadLine();
}
}
}
Thanks for reading