2012-04-11 52 views
8

He siguiente código para obtener el WeekNumber del año dado en el Tiempo objeto DateTimeSemana del año C# de fecha y hora

public static int WeeksInYear(DateTime date) 
    { 
     GregorianCalendar cal = new GregorianCalendar(GregorianCalendarTypes.Localized); 
     return cal.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); 
    } 

Ahora daré la función de la fecha 1/1/2012 wich debe devolver la semana 1, pero regresa la semana 52. Y no puedo entender por qué. Alguien tiene una idea de por qué ?

+0

tratar con este 'cal.GetWeekOfYear (fecha, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday)' – Raghuveer

+0

@RaghuveerGuthikonda: Eso funcionaría sólo en este caso especial. P.ej. 1/1/2013 podría ser un sábado, no funcionará. Es la forma en que se calculan las semanas calendario. El 1/1/2012 está en la semana 52 y debería estar allí. – basti

Respuesta

8

El algoritmo está haciendo exactamente lo que le ordenó que haga. Tiene CalanderWeekRule establecido en FirstFourDayWeek. El 1 de enero de 2012 no fue parte de la primera semana de cuatro días, por lo que ha ordenado al calander comenzar a contar desde el 2 de enero.

Calculate date from week number

0

que asumir que porque 1/1/2012 era un domingo y GetWeekOfYear dice que vuelve la semana que incluye la fecha, se vuelve la última semana de 2011 en lugar de la primera semana de 2012.

Eche un vistazo a CalendarRule para aclaraciones.

0

1/1/2012 era domingo. Creo que es por eso que obtienes 52, porque fue el último día del año pasado. Para el 2 de enero deberías obtener el resultado correcto.

1

El número de semana se calculó correctamente. Debería leer cómo se calculan/cuentan realmente los números de semana (¿Wikipedia ?!).

Atención: El cálculo integrado del cálculo del número de semana tiene errores. Microsoft describe el problema en el KnowledgeBase-Article 200299. Tiene problemas con ISO-8601.

1

Puede utilizar la clase Semana del Time Period Library for .NET que apoya apoya la norma ISO 8601 numeración de las semanas:

TimeCalendar calendar = new TimeCalendar(
    new TimeCalendarConfig { YearWeekType = YearWeekType.Iso8601 }); 
Week week = new Week(new DateTime(2012, 01, 01), calendar); 
Console.WriteLine("week #: ", week.WeekOfYear); 
4
public static int WeeksInYear(DateTime date) 
{ 
    GregorianCalendar cal = new GregorianCalendar(GregorianCalendarTypes.Localized); 
    return cal.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Monday); 

Creo que si el cambio CalendarWeekRule.FirstFourDayWeek a CalendarWeekRule.FirstDay entonces esto funcionará bien.

cambio esto y funciona bien.

Cuestiones relacionadas