2009-03-18 11 views
10

Como dice el título, dado el año y el número de semana, ¿cómo obtengo el número de mes?¿Cómo obtengo el número de mes del año y el número de semana en C#?

edición: si una semana cruza dos meses, quiero que el mes, el primer día de la semana está en

de edición (2):. Así es como me sale el número de la semana:

CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstDay, DayOfWeek.Monday); 

Estoy tratando de hacer lo contrario.

+1

lo contrario es simplemente no bien definidas. Las respuestas a continuación contienen algunas preguntas relevantes, intenta responderlas. –

Respuesta

4

Esto es lo que terminé haciendo:

static int GetMonth(int Year, int Week) 
{ 
    DateTime tDt = new DateTime(Year, 1, 1); 

    tDt.AddDays((Week - 1) * 7); 

    for (int i = 0; i <= 365; ++i) 
    { 
     int tWeek = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(
      tDt, 
      CalendarWeekRule.FirstDay, 
      DayOfWeek.Monday); 
     if (tWeek == Week) 
      return tDt.Month; 

     tDt = tDt.AddDays(1); 
    } 
    return 0; 
} 

Hubiera preferido algo más simple, pero funciona :)

2

¿No dependería también del día de la semana?

0

Usted no puede. Necesita al menos el día en que comienza la primera semana (o cuando comienza la semana), para obtener una respuesta precisa.

+4

Que se define en CultureInfo –

0

Usted no puede. Una semana puede comenzar en un mes y terminar en otra.

0

Creo que está asumiendo que una "semana" es cualquier grupo de 7 días consecutivos. No lo es Dado el año (2008), la semana (5), podría estar en enero o febrero, dependiendo de cuándo comience su "semana".

1

Otro problema que podría enfrentar es que la mayoría de los años no comienzan al principio de una semana, lo que lo cambia todo.

9

Si se supone que el primer día de su definición de la semana es el mismo día que el primero día del año, entonces esto va a trabajar:

int year = 2000; 
int week = 9; 
int month = new DateTime(year, 1, 1).AddDays(7 * (week - 1)).Month; 

Obviamente, un cierto respuesta dependería cómo define el primer día de la semana y cómo define cómo una semana cae en un mes cuando se superpone a más de uno.

+1

Respuesta inteligente ... –

+0

Si hablamos de una semana ISO8601, algo basado en los algoritmos en http://stackoverflow.com/questions/662379/calculate-date-from-week-number Sería más cierto. –

+0

¿Por qué lo asumirías? También podría suponer que una semana tiene 366 días.Lo harías bien una vez fuera de 52 ;-) – Zano

1

esto debería ser capaz de ayudar

public int getMonth(int weekNum, int year) 
{ 
    DateTime Current = new DateTime(year, 1, 1); 
    System.DayOfWeek StartDOW = Current.DayOfWeek; 
    int DayOfYear = (weekNum * 7) - 6; //1st day of the week 

    if (StartDOW != System.DayOfWeek.Sunday) //means that last week of last year's month 
    { 
     Current = Current.AddDays(7 - (int)Current.DayOfWeek); 
    } 
    return Current.AddDays(DayOfYear).Month; 
} 
-1
// Calculate the week number according to ISO 8601 

    public static int Iso8601WeekNumber(DateTime dt) 
    { 
      return CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); 
    } 

// ... 

DateTime dt = DateTime.Now; 

// Calculate the WeekOfMonth according to ISO 8601 
int weekOfMonth = Iso8601WeekNumber(dt) - Iso8601WeekNumber(dt.AddDays(1 - dt.Day)) + 1; 
1

Suposiciones:

  1. El domingo es el primer día de la semana.
  2. La semana parcial todavía cuenta como la semana 1
  3. Salidas del mes inicial y final como matriz entera.

    public int[] getMonth(int weekNum, int year) 
    { 
    
        DateTime StartYear = new DateTime(year, 1, 1); 
        System.DayOfWeek StartDOW = StartYear.DayOfWeek; 
        DateTime DayOfYearWeekStart = default(DateTime); 
        DateTime DayOfYearWeekEnd = default(DateTime); 
        int x = 0; 
        if ((StartDOW == System.DayOfWeek.Sunday)) { 
         DayOfYearWeekStart = StartYear.AddDays((weekNum - 1) * 7); 
         DayOfYearWeekEnd = DayOfYearWeekStart.AddDays(6); 
        } else { 
         for (x = 0; x <= 7; x += 1) { 
          if (StartYear.AddDays(x).DayOfWeek == DayOfWeek.Sunday) { 
           break; // TODO: might not be correct. Was : Exit For 
          } 
         } 
    
         if (weekNum == 1) { 
          DayOfYearWeekStart = StartYear; 
          DayOfYearWeekEnd = StartYear.AddDays(x - 1); 
         } else if (weekNum > 1) { 
          DayOfYearWeekStart = StartYear.AddDays(((weekNum - 2) * 7) + x); 
          DayOfYearWeekEnd = DayOfYearWeekStart.AddDays(6); 
         } 
    
        } 
    
        int[] Month = new int[2]; 
        Month[0] = DayOfYearWeekStart.Month; 
        Month[1] = DayOfYearWeekEnd.Month; 
    
        return Month; 
    } 
    
Cuestiones relacionadas