Pergunta

Atualmente, estou escrevendo um pequeno calendário no ASP.Net C#.Atualmente para produzir as linhas de semanas que eu faça o seguinte loop:

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

Isso funciona bem, no entanto, algumas mês só tem 5 semanas e, em alguns casos raros, 4.

Como posso calcular o número de linhas que serão necessários para um mês específico?

Este é um exemplo do que estou criando:

enter image description here

Como você pode ver acima mês, há apenas 5 linhas necessário, no entanto.Tome este mês (agosto de 2008), que teve início no sábado e termina na segunda-feira na 6ª Semana/Linha.

Imagem encontrada no google


Este é um exemplo do que estou criando:

enter image description here

Como você pode ver acima mês, há apenas 5 linhas necessário, no entanto.Tome este mês (agosto de 2008), que teve início no sábado e termina na segunda-feira na 6ª Semana/Linha.

Imagem encontrada no google

Foi útil?

Solução

Aqui é o método que faz isso:

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

Você pode personalizar o calendário da semana de regra modificando o Sistema.Globalização.CalendarWeekRule.FirstFourDayWeek parte.Espero que o código é auto explicativo.

Outras dicas

Bem, isso depende de a cultura que você está usando, mas vamos supor que você pode usar Thread.CurrentThread.CurrentCulture, em seguida, o código para obter a semana de hoje seria:

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

Como se trata de verificar que semana o primeiro e o último dias será?

Seleção Calendário.GetWeekOfYear.Ele deve fazer o truque.

Há um problema com ele, ele não siga os 4 dias de regra pela ISO 8601, mas caso contrário, ele é puro.

você pode obter os dias de um mês usando DateTime.DaysInMonth(int WhichYear,int WhichMonth);

Os meses no calendário Juliano / calendário Gregoriano ter o mesmo número de dias de cada ano, exceto fevereiro, que pode ter 28 ou 29 dias, dependendo do leapness do ano.Você pode encontrar o número de dias na seção de Descrição em http://en.wikipedia.org/wiki/Gregorian_calendar.

Como o @darkdog mencionou que você tem DateTime.DaysInMonth.Basta fazer isso:

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

Levar em consideração o fato de que a globalização / fins de localização, algumas partes do mundo utilizam diferentes calendários / métodos de organização do ano.

O problema não é o número de dias do mês, é quantas semanas ele se estende por mais.

De fevereiro, em um ano não-bissexto terá 28 dias, e, se o primeiro dia do mês é uma segunda-feira, fevereiro terá uma duração de exatamente 4 números da semana.

No entanto, se o primeiro dia do mês é uma terça-feira ou qualquer outro dia da semana, de fevereiro terá uma duração de 5 números da semana.

31 dia do mês podem se estender por 5 a 6 semanas, o mesmo caminho.Se o mês começa na segunda-feira, 31 dias dá-lhe 5 números da semana.Se o mês começa no sábado ou domingo, ele terá uma duração de 6 números da semana.

Portanto, o caminho certo para obter este número é encontrar o número da semana do primeiro e últimos dias do mês.


Edição #1:Veja aqui como calcular o número de semanas em um determinado mês abrange:Edição #2:Corrigido bugs no código

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

Tente isso,

DateTime.DaysInMonth

Primeiro descubra qual o dia da semana do primeiro dia do mês em que se encontra.Apenas para novas até uma data e hora com o primeiro dia, sempre 1, e o ano e o mês em questão, há um dia da semana propriedade.

Em seguida, a partir daqui, você pode usar o número de dias no mês, DateTime.DaysInMonth, para determinar quantas semanas, quando você divide por sete e, em seguida, adicionar o número de dias a partir de 1 de que o seu primeiro dia cai.Por exemplo,

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top