2008-08-13 14 views
7

Ich schreibe gerade einen kleinen Kalender in ASP.Net C#. Derzeit die Reihen der Wochen zu produzieren ich folgend für Schleife tun:DateTime Wochen in Zeilen berechnen

var iWeeks = 6; 
for (int w = 0; w < iWeeks; w++) { 

Das funktioniert gut, jedoch werden einige Monate nur 5 Wochen haben und in einigen seltenen Fällen, 4.

Wie kann ich Berechnen Sie die Anzahl der Zeilen, die für einen bestimmten Monat benötigt werden?

Dies ist ein Beispiel dafür, was ich schaffe:

enter image description here

Wie Sie für den obigen Monat sehen können, gibt es nur 5 Zeilen erforderlich, jedoch. Nehmen Sie diesen Monat (August 2008), der an einem Samstag begann und an einem Montag auf der 6. Woche/Reihe endet.

Bild gefunden auf Google


Dies ist ein Beispiel dafür, was ich schaffe:

enter image description here

Wie Sie für den obigen Monat sehen können, gibt es nur 5 Zeilen erforderlich. Nehmen Sie diesen Monat (August 2008), der an einem Samstag begann und an einem Montag auf der 6. Woche/Reihe endet.

Bild gefunden auf Google

Antwort

6

Hier ist die Methode, die es tut:

public int GetWeekRows(int year, int month) 
{ 
    DateTime firstDayOfMonth = new DateTime(year, month, 1); 
    DateTime lastDayOfMonth = new DateTime(year, month, 1).AddMonths(1).AddDays(-1); 
    System.Globalization.Calendar calendar = System.Threading.Thread.CurrentThread.CurrentCulture.Calendar; 
    int lastWeek = calendar.GetWeekOfYear(lastDayOfMonth, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); 
    int firstWeek = calendar.GetWeekOfYear(firstDayOfMonth, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); 
    return lastWeek - firstWeek + 1; 
} 

Sie können durch Modifizieren der System.Globalization.CalendarWeekRule.FirstFourDayWeek Teil der Kalenderwoche Regel anpassen. Ich hoffe, der Code ist selbsterklärend.

0

Wie wäre Überprüfung welcher Woche die ersten und letzten Tage in sein?

0

Die Monate im Julianischen/Gregorianischen Kalender haben die gleiche Anzahl an Tagen pro Jahr, außer Februar, die 28 oder 29 Tage haben können, abhängig von der Sprunghaftigkeit des Jahres. Sie können die Anzahl der Tage im Abschnitt Beschreibung unter http://en.wikipedia.org/wiki/Gregorian_calendar finden.

Wie @darkdog erwähnt haben Sie DateTime.DaysInMonth. Genau dies tun:

var days = DateTime.DaysInMonth(year, month) + 
      WhatDayOfWeekTheMonthStarts(year, month);  
int rows = (days/7); 
if (0 < days % 7) 
{ 
    ++rows; 
} 

Berücksichtigen Sie die Tatsache, dass für die Globalisierung/Lokalisierung Zwecke, einige Teile der Welt unterschiedlich verwenden Kalender/Methoden der Organisation des Jahres.

0

die Sie interessieren,

DateTime.DaysInMonth 
2

Nun, hängt es von der Kultur, die Sie verwenden, aber nehmen wir an, Sie Thread.CurrentThread.CurrentCulture verwenden können, dann den Code der Woche von heute sein würde, zu erhalten:

Culture culture = Thread.CurrentThread.CurrentCulture; 
Calendar cal = culture.Calendar; 
Int32 week = cal.GetWeekOfYear(DateTime.Today, 
    culture.DateTimeFormat.CalendarWeekRule, 
    culture.DateTimeFormat.FirstDayOfWeek); 
0

Überprüfen Sie Calendar.GetWeekOfYear. Es sollte den Trick machen.

Es gibt ein Problem damit, es folgt nicht der 4-Tage-Regel von ISO 8601, aber ansonsten ist es ordentlich.

0

können Sie die Tage eines Monats mit DateTime abrufen.DaysInMonth (int which year, int whichmonth);

0

Das Problem ist nicht die Anzahl der Tage im Monat, es ist wie viele Wochen es überspannt.

Februar in einem Nicht-Schaltjahr wird 28 Tage haben, und wenn der erste Tag des Monats ein Montag ist, wird der Februar genau 4 Wochen-Nummern umfassen.

Wenn der erste Tag des Monats jedoch ein Dienstag oder ein anderer Tag der Woche ist, wird der Februar 5-Wochen-Nummern umfassen.

Ein 31-Tage-Monat kann 5 oder 6 Wochen den gleichen Weg umfassen. Wenn der Monat an einem Montag beginnt, geben die 31 Tage 5-Wochen-Zahlen. Wenn der Monat am Samstag oder Sonntag beginnt, wird er 6 Wochen umfassen.

Der richtige Weg, um diese Nummer zu erhalten, ist es, die Wochennummer des ersten und letzten Tages des Monats zu finden.


Edit # 1: Hier ist, wie die Anzahl der Wochen ein bestimmten Monat erstreckt sich über berechnen: Edit # 2: Korrigierte Fehler im Code

public static Int32 GetWeekForDateCurrentCulture(DateTime dt) 
{ 
    CultureInfo culture = Thread.CurrentThread.CurrentCulture; 
    Calendar cal = culture.Calendar; 
    return cal.GetWeekOfYear(dt, 
     culture.DateTimeFormat.CalendarWeekRule, 
     culture.DateTimeFormat.FirstDayOfWeek); 
} 

public static Int32 GetWeekSpanCountForMonth(DateTime dt) 
{ 
    DateTime firstDayInMonth = new DateTime(dt.Year, dt.Month, 1); 
    DateTime lastDayInMonth = firstDayInMonth.AddMonths(1).AddDays(-1); 
    return 
     GetWeekForDateCurrentCulture(lastDayInMonth) 
     - GetWeekForDateCurrentCulture(firstDayInMonth) 
     + 1; 
} 
0

Erste, der den Wochentag Finden Sie heraus, Der erste Tag des Monats ist in. Nur neu ein Datetime mit dem ersten Tag, immer 1, und das Jahr und den Monat in Frage, es ist ein Tag der Woche Eigentum.

Dann können Sie von hier aus die Anzahl der Tage im Monat, DateTime.DaysInMonth, verwenden, um zu bestimmen, wie viele Wochen Sie durch sieben teilen und dann die Anzahl der Tage von 1 zu Ihrem ersten Tag hinzufügen. Zum Beispiel

public static int RowsForMonth(int month, int year) 
{ 
    DateTime first = new DateTime(year, month, 1); 

    //number of days pushed beyond monday this one sits 
    int offset = ((int)first.DayOfWeek) - 1; 

    int actualdays = DateTime.DaysInMonth(month, year) + offset; 

    decimal rows = (actualdays/7); 
    if ((rows - ((int)rows)) > .1) 
    { 
     rows++; 
    } 
    return rows; 
} 
Verwandte Themen