2009-03-18 4 views
10

Как говорится в названии, учитывая год и номер недели, как мне получить номер месяца?Как получить номер месяца с номера года и недели в C#?

редактировать: если неделю пересекает два месяца, я хочу месяца первый день недели в

редактировать (2):. Это, как я получаю номер недели:

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

Я просто пытаюсь сделать обратное.

+1

Обратное просто не очень хорошо определены. В приведенных ниже ответах содержатся некоторые актуальные вопросы, попробуйте ответить на них. –

ответ

4

Это то, что я в конечном итоге делает:

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

я предпочел бы что-нибудь попроще, но это работает :)

2

Не будет ли это также зависеть от дня недели?

0

Вы не можете. Вам нужен по крайней мере день, в который начинается первая неделя (или когда начинается неделя), чтобы получить точный ответ.

+4

Что определено в CultureInfo –

0

Вы не можете. Неделя может начинаться через месяц и заканчиваться другим.

0

Я думаю, вы считаете, что «неделя» - это любая группа из 7 последовательных дней. Это не так. Данный Год (2008), Неделя (5), вы можете быть в январе или феврале, в зависимости от того, когда начнется ваша «неделя».

1

Еще одна проблема, с которой вы могли столкнуться, заключается в том, что большинство лет не начинается в начале недели, что сдвигает все.

9

Если предположить, что в первый день вашего определения недели в тот же день, как 1-й день года, то это будет работать:

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

Очевидно, что истинный ответ будет зависеть от как вы определяете первый день недели, и как вы определяете, как неделя попадает в месяц, когда она перекрывает более одного.

+1

Умный ответ ... –

+0

Если мы говорим об неделе ISO8601, то что-то, основанное на алгоритмах в http://stackoverflow.com/questions/662379/calculate-date-from-week-number будет более верным. –

+0

Зачем вы это предполагаете? Можно предположить, что неделя длится 366 дней.Вы получили бы это право один раз из 52 ;-) – Zano

1

это должно быть в состоянии помочь

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

Допущения:

  1. Воскресенье - первый день недели.
  2. Частичная неделя по-прежнему считается неделей 1
  3. Выводит начало и конец месяца как целочисленный массив.

    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; 
    } 
    
Смежные вопросы