2009-03-18 5 views
10

Comme le dit le titre, compte tenu du numéro de l'année et de la semaine, comment puis-je obtenir le numéro du mois?Comment puis-je obtenir le numéro du mois de l'année et le numéro de la semaine dans C#?

edit: si une semaine traverse deux mois, je veux que le mois le premier jour de la semaine est en

modifier (2). Voilà comment je reçois le numéro de la semaine:

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

J'essaie juste de faire l'inverse.

+1

L'inverse est tout simplement pas bien défini. Les réponses ci-dessous contiennent des questions pertinentes, essayez d'y répondre. –

Répondre

4

C'est ce que je fini par faire:

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

j'aurais préféré quelque chose de plus simple, mais il fonctionne :)

2

Cela ne dépendrait-il pas aussi du jour de la semaine?

0

Vous ne pouvez pas. Vous avez besoin au moins du jour où commence la 1ère semaine (ou au début de la semaine), pour obtenir une réponse précise.

+4

Ce qui est défini dans CultureInfo –

0

Vous ne pouvez pas. Une semaine peut commencer dans un mois et se terminer dans un autre.

0

Je pense que vous supposez qu'une «semaine» est un groupe de 7 jours consécutifs. Ce n'est pas. Selon l'année (2008), la semaine (5), vous pourriez être en janvier ou en février, selon le début de votre «semaine».

1

Un autre problème que vous pourriez rencontrer est que la plupart des années ne commencent pas au début d'une semaine, ce qui déplace tout.

9

Si vous supposez que le premier jour de votre définition de la semaine est le même jour que le 1er jour de l'année, cela fonctionnera:

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

De toute évidence, une vraie réponse dépendra comment définissez-vous le premier jour de la semaine et comment vous définissez comment une semaine tombe dans un mois lorsqu'elle en chevauche plusieurs.

+1

Réponse intelligente ... –

+0

Si nous parlons d'une semaine ISO8601, alors quelque chose basé sur les algorithmes dans http://stackoverflow.com/questions/662379/calculate-date-from-week-number serait plus vrai. –

+0

Pourquoi le supposeriez-vous? Vous pourriez aussi bien supposer qu'une semaine dure 366 jours.Vous obtiendriez le bon moment sur 52 ;-) – Zano

1

cela devrait être en mesure d'aider

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

Hypothèses:

  1. Le dimanche est le premier jour de la semaine.
  2. La semaine partielle compte toujours comme semaine 1
  3. Sort le début et la fin du mois sous la forme d'un tableau d'entiers.

    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; 
    } 
    
Questions connexes