Nota
que parecen haber perdido error. El código actual se actualizó a partir del 01/01/2012 para tener en cuenta este hecho y ahora derivamos el daysOffset
basado en martes, que según Mikael Svenson parece resolver el problema. Vea esto answer para más detalles.
La mayoría de las personas tiende a equivocarse y me refiero a no cumplir con la norma de fecha de la semana ISO8601 (usamos esto mucho en Suecia). Este cálculo es un poco extraño, pero que se reduce a este código en .NET:
DateTime jan1 = new DateTime(yyyy, 1, 1);
int daysOffset = DayOfWeek.Tuesday - jan1.DayOfWeek;
DateTime firstMonday = jan1.AddDays(daysOffset);
var cal = CultureInfo.CurrentCulture.Calendar;
int firstWeek = cal.GetWeekOfYear(jan1, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
var weekNum = ww;
if (firstWeek <= 1)
{
weekNum -= 1;
}
var result = firstMonday.AddDays(weekNum * 7 + d - 1);
return result;
Se calculará la fecha de un año (aaaa), número de la semana (ww) y el día de la semana (d). Lo hace primero estableciendo el primero de enero usando el calendario incorporado (por lo que este código se puede personalizar). La razón por la que esto es un poco extraño es porque la semana 53 a veces ocurre en enero y, a veces, la semana 1 ocurre en diciembre.
Si necesita ir al otro lado, no es del todo trivial, pero la forma correcta de hacerlo en .NET se muestra aquí.
var c = CultureInfo.CurrentCulture.Calendar;
// `FromDayOfWeek` fixes problem with the enumeration
// not based on Monday being the first day of the week
d = (byte)FromDayOfWeek(c.GetDayOfWeek(t));
switch (d)
{
case 1:
case 2:
case 3:
// see this for details
// http://blogs.msdn.com/shawnste/archive/2006/01/24/iso-8601-week-of-year-format-in-microsoft-net.aspx
t = t.AddDays(3);
break;
}
ww = (byte)c.GetWeekOfYear(t, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
// Adjust year when week 53 occurs in January or week 1 occurs in December
if (ww == 53 && t.Month == 1)
{
yyyy = (short)(t.Year - 1);
}
else if (ww == 1 && t.Month == 12)
{
yyyy = (short)(t.Year + 1);
}
else
{
yyyy = (short)t.Year;
}
posible duplicado de [Calcular la fecha del número de la semana] (http://stackoverflow.com/questions/662379/calculate-date-from-week-number) – andreiursan