2009-03-18 12 views
10

Jak wskazuje tytuł, biorąc pod uwagę rok i numer tygodnia, w jaki sposób mogę uzyskać numer miesiąca?Jak uzyskać numer miesiąca z numeru roku i tygodnia w języku C#?

edit: jeśli w tygodniu przecina dwa miesiące, chcę miesiąca pierwszy dzień tygodnia jest w

edit (2). W ten sposób mogę uzyskać numer tygodnia:

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

Po prostu próbuję zrobić odwrotność.

+1

odwrotna jest nie tylko dobrze zdefiniowana. Poniższe odpowiedzi zawierają kilka istotnych pytań, postaraj się na nie odpowiedzieć. –

Odpowiedz

4

To, co skończyło się robi:

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

wolałbym coś prostszego, ale działa :)

2

Czy nie zależy to również od dnia tygodnia?

0

Nie możesz. Aby uzyskać dokładną odpowiedź, potrzebujesz co najmniej dnia rozpoczęcia pierwszego tygodnia (lub rozpoczęcia tygodnia).

+4

Który jest zdefiniowany w CultureInfo –

0

Nie możesz. Tydzień może rozpocząć się za jeden miesiąc, a zakończyć w innym.

0

Myślę, że zakładasz, że "tydzień" to jakaś grupa 7 kolejnych dni. Nie jest. Biorąc pod uwagę rok (2008), tydzień (5), możesz być w styczniu lub lutym, w zależności od tego, kiedy zaczyna się "tydzień".

1

Kolejnym problemem, z którym można się spotkać, jest to, że większość lat nie zaczyna się od początku tygodnia, co zmienia wszystko.

9

Jeśli przyjąć, że pierwszy dzień swojej definicji tydzień jest taki sam dzień jak 1 dzień w roku, to będzie działać:

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

Oczywiście, prawda odpowiedź będzie zależeć od jak definiujesz pierwszy dzień tygodnia i jak definiujesz, jak tydzień przypada na miesiąc, w którym nakłada się więcej niż jeden.

+1

Sprytna odpowiedź ... –

+0

Jeśli mówimy o tygodniu ISO8601, to coś w oparciu o algorytmy w http://stackoverflow.com/questions/662379/calculate-date-from-eek-number byłoby bardziej prawdziwe. –

+0

Dlaczego miałbyś to zakładać? Równie dobrze można założyć, że tydzień trwa 366 dni.Zrobiłbyś to dobrze jeden raz z 52 ;-) – Zano

1

ten powinien być w stanie pomóc

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

Założenia:

  1. Niedziela jest pierwszym dniem tygodnia.
  2. Częściowy tydzień nadal liczy się jako tydzień 1
  3. Powoduje rozpoczęcie i zakończenie miesiąca jako tablica liczb całkowitych.

    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; 
    } 
    
Powiązane problemy