Nota
mi sembra di aver perso bug. Il codice attuale è stato aggiornato dal 2012-01-30 per tenere conto di questo fatto e ora deriviamo il daysOffset
basato su Martedì che, secondo lo Mikael Svenson, sembra risolvere il problema. Vedi questo answer per i dettagli.
La maggior parte delle persone tende a sbagliare e, per errore, non è conforme allo standard ISO8601 (lo usiamo molto in Svezia). Questo calcolo è un po 'strano, ma tutto si riduce a questo codice in .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;
Sarà calcolare la data di un anno (aaaa), numero della settimana (WW) e giorno della settimana (d). Lo fa prima stabilendo il primo di gennaio usando il calendario integrato (quindi questo codice può essere personalizzato). Il motivo per cui questo è un po 'strano è perché la settimana 53 a volte si verifica a gennaio e talvolta la settimana 1 si verifica a dicembre.
Se hai bisogno di andare oltre, non è del tutto banale ma il modo corretto di farlo in .NET è mostrato qui.
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;
}
fonte
2011-03-21 13:21:39
possibile duplicato del [Calcola data dal numero della settimana] (http://stackoverflow.com/questions/662379/calculate-date-from-week-number) – andreiursan