Calcular DateTime Semanas em Linhas
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:
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:
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
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;
}