2010-10-04 14 views
9

Quiero crear una función en C# que para un número de semana me devolverá los días, en esa semana.En .net, conociendo el número de semana ¿cómo puedo obtener la fecha de la semana?

Por ejemplo, para la semana número 40, ¿cómo puedo obtener los días: 4/10, 5/10, 6/10, 7/10, 8/10, 9/10, 10/10.

¡Gracias de antemano!

+0

posible duplicado de [Calcular la fecha del número de la semana] (http://stackoverflow.com/questions/662379/calculate-date-from-week-number) – andreiursan

Respuesta

8

creo que esto debería hacer lo que quiera:

public static DateTime[] WeekDays(int Year, int WeekNumber) 
    { 
     DateTime start = new DateTime(Year, 1, 1).AddDays(7 * WeekNumber); 
     start = start.AddDays(-((int)start.DayOfWeek)); 
     return Enumerable.Range(0, 7).Select(num => start.AddDays(num)).ToArray(); 
    } 

A pesar de que trato a domingo como primer día de la semana, si quieres el lunes como primer rango de cambio del día (0,7) a (1,7)

Si desea conformar el estándar ISO, creo que esto debería funcionar:

public static DateTime[] WeekDays(int Year, int WeekNumber) 
    { 
     DateTime start = new DateTime(Year, 1, 4); 
     start = start.AddDays(-((int)start.DayOfWeek)); 
     start = start.AddDays(7 * (WeekNumber - 1)); 
     return Enumerable.Range(0, 7).Select(num => start.AddDays(num)).ToArray(); 
    } 
+1

Eso básicamente depende de en qué parte del mundo se encuentre, porque en Europa la semana 1 es la primera semana con 4 días, mientras que en EE. UU. es la semana con 1/1 (http: //en.wikipedia.org/wiki/Seven-day_week#Week_numbering) - por lo que el código es correcto, excepto que es posible que sea necesario ajustar la "base". – veggerby

+2

Por lo que recuerdo de un proyecto antiguo, el código anterior no funcionará al calcular con ISO-Weeks (8601 que se usa en Europa a menudo) también si la base se ajustará (ver mi respuesta). Pero tal vez esto ha cambiado con .net4. – HCL

+0

Sí, tiene razón, no sigue el estándar ISO. Podría ajustarse con bastante facilidad para adaptarse al estándar. Pondrá y corregirá. – JDunkerley

1

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; 
} 
1

La función siguiente le ayudará a conseguir la fecha del número de la semana y el año a partir

public DateTime GetFirstDayFromWeekNumber(int weekNumber, int weekYear) 
     { 
      DateTime beginingYear = new DateTime(weekYear, 1, 1); 
      DateTime finalDate = new DateTime(); 
      int maxDayOfWeek = (int)DayOfWeek.Saturday; 
      int yearStartDay = (int)beginingYear.DayOfWeek; 
      int dayDeference = maxDayOfWeek - yearStartDay; 

      if (weekNumber == 1) 
      { 
       finalDate = beginingYear.AddDays(-yearStartDay); 
      } 
      else if (weekNumber == 2) 
      { 
       finalDate = beginingYear.AddDays((dayDeference + 1)); 
      } 
      else if (weekNumber > 2 && weekNumber <= 53) 
      { 
       finalDate = beginingYear.AddDays((dayDeference + 1) + ((weekNumber - 2)* 7)); 
      } 
      return finalDate; 
     } 
Cuestiones relacionadas