Как получить номер месяца из номера года и недели в c #? - PullRequest
10 голосов
/ 18 марта 2009

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

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

edit (2): Вот как я получаю номер недели:

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

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

Ответы [ 10 ]

9 голосов
/ 18 марта 2009

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

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

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

4 голосов
/ 18 марта 2009

Вот что я закончил:

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 голосов
/ 22 декабря 2011

это должно помочь

 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;
}
2 голосов
/ 18 марта 2009

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

1 голос
/ 28 января 2016

Допущения:

  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;
    }
    
1 голос
/ 18 марта 2009

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

0 голосов
/ 27 июня 2014
// 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;
0 голосов
/ 18 марта 2009

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

0 голосов
/ 18 марта 2009

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

0 голосов
/ 18 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...