Să calculeze săptămânile de date în rânduri

În prezent scriu un calendar mic în ASP.Net C #. În prezent, pentru a produce rândurile din săptămânile pe care le fac următoarele pentru buclă:

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

Acest lucru funcționează bine, cu toate acestea, o lună va avea doar 5 săptămâni și, în unele cazuri rare, 4.

Cum pot calcula numărul de rânduri care vor fi necesare pentru o anumită lună?

Acesta este un exemplu al ceea ce creez:

introduceți descrierea imaginii aici

După cum puteți vedea pentru luna precedentă, există doar 5 rânduri necesare. Luați această lună (august 2008), care a început sâmbătă și se termină luni în a șasea săptămână/rundă.

Imaginea găsită pe Google


Acesta este un exemplu al ceea ce creez:

introduceți descrierea imaginii aici

După cum puteți vedea pentru luna precedentă, există doar 5 rânduri necesare. Luați această lună (august 2008), care a început sâmbătă și se termină luni în a șasea săptămână/rundă.

Imaginea găsită pe Google

0
fr hi bn

9 răspunsuri

Mai întâi Aflați în ce zi lucrătoare este prima zi a lunii. Doar o dată la întâlnire cu prima zi, întotdeauna 1, și anul și luna în cauză, există o proprietate zi de săptămână pe ea.

Apoi de aici puteți utiliza numărul de zile din lună, DateTime.DaysInMonth , pentru a determina câte săptămâni când împărțiți cu șapte și apoi adăugați numărul de zile de la 1 pe care primul dvs. ziua cade. De exemplu,

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;
}
0
adăugat

Ce zici de a verifica ce săptămână va fi prima și ultima zi?

0
adăugat

Ei bine, depinde de cultura pe care o utilizați, dar să presupunem că puteți folosi Thread.CurrentThread.CurrentCulture, atunci codul pentru a obține săptămâna de azi ar fi:

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

Problema nu este numărul de zile din lună, ci de câte săptămâni se întinde.

Februarie într-un an non-salt va avea 28 de zile, iar dacă prima zi a lunii este luni, februarie va avea un număr exact de 4 săptămâni.

Cu toate acestea, dacă prima zi a lunii este marți, sau orice altă zi a săptămânii, februarie va cuprinde numere de 5 săptămâni.

O lună de 31 de zile poate dura 5 sau 6 săptămâni în același mod. Dacă luna începe de luni, cele 31 de zile vă oferă numere de 5 săptămâni. În cazul în care luna începe în sâmbătă sau duminică, va avea o durată de 6 săptămâni.

Deci, modul corect de a obține acest număr este de a găsi numărul săptămânii din prima și ultima zi a lunii.


Edit #1: Here's how to calculate the number of weeks a given month spans: Edit #2: Fixed bugs in 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
adăugat

Lunile din calendarul iulian/gregorian au același număr de zile în fiecare an, cu excepția lunii februarie, care poate avea 28 sau 29 de zile, în funcție de saltul anului. Puteți găsi numărul de zile din secțiunea Descriere la http://en.wikipedia.org/wiki/ Gregorian_calendar.

Deoarece @darkdog a menționat că aveți DateTime.DaysInMonth. Doar faceți acest lucru:

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

Țineți cont de faptul că pentru scopuri de globalizare/localizare, anumite părți ale lumii folosesc diferite calendare/metode de organizare a anului.

0
adăugat

Iată metoda care o face:

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

Puteți personaliza regula săptămânii calendarului modificând secțiunea System.Globalization.CalendarWeekRule.FirstFourDayWeek. Sper ca codul să fie explicativ.

0
adăugat

Incearca asta,

DateTime.DaysInMonth
0
adăugat

puteți obține zilele de o lună utilizând DateTime.DaysInMonth (int CareYear, int CareMonth);

0
adăugat

Consultați Calendar.GetWeekOfYear . Ar trebui să facă truc.

Există o problemă cu aceasta, nu respectă regula de 4 zile de ISO 8601, dar altfel este curată.

0
adăugat