Я в настоящее время пишу маленький календарь в ASP.NET C#. В настоящее время для создания строк недель я делаю следующее для цикла:
var iWeeks = 6;
for (int w = 0; w < iWeeks; w++) {
Это хорошо работает, однако, некоторый месяц будет только иметь 5 недель и в некоторых редких случаях, 4.
Как я могу вычислить количество строк, которые будут требоваться в течение конкретного месяца?
Это - пример того, что я создаю:
Как Вы видите в течение вышеупомянутого месяца, существует только 5 требуемых строк, как бы то ни было. Возьмите в этом месяце (август 2008), который запустился в субботу и концы в понедельник в 6-ю Неделю/Строку.
Изображение найдено на Google
Это - пример того, что я создаю:
Как Вы видите в течение вышеупомянутого месяца, существует только 5 требуемых строк, как бы то ни было. Возьмите в этом месяце (август 2008), который запустился в субботу и концы в понедельник в 6-ю Неделю/Строку.
Изображение найдено на Google
Вот метод, который делает это:
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;
}
Можно настроить правило календарной недели путем изменения Системы. Глобализация. CalendarWeekRule. Часть FirstFourDayWeek. Я надеюсь, что код сам объяснительный.
Как насчет того, чтобы проверить, в котором будет неделя первые и последние дни?
Ну, это зависит от культуры, которую Вы используете, но давайте предположим, что можно использовать Поток. CurrentThread. CurrentCulture, затем код для получения недели сегодня был бы:
Culture culture = Thread.CurrentThread.CurrentCulture;
Calendar cal = culture.Calendar;
Int32 week = cal.GetWeekOfYear(DateTime.Today,
culture.DateTimeFormat.CalendarWeekRule,
culture.DateTimeFormat.FirstDayOfWeek);
можно получить дни месяца при помощи DateTime. DaysInMonth (международный WhichYear, международный WhichMonth);
Проверьте Календарь. GetWeekOfYear. Это должно добиться цели.
Существует проблема с ним, это не следует 4-дневному правилу ISO 8601, но иначе это аккуратно.
Проблемой не является количество дней в месяце, это - сколько недель это охватывает.
Февраль в невисокосный год будет иметь 28 дней, и если первый день месяца будет понедельником, то февраль охватит точно 4-недельные числа.
Однако, если первый день месяца будет вторником или каким-либо другим днем недели, то февраль охватит 5-недельные числа.
31-дневный месяц может охватить 5 или 6 недель тот же путь. Если месяц запускается в понедельник, этот 31 день дает Вам 5-недельные числа. Если месяц запустится в субботу или в воскресенье, то он охватит 6-недельные числа.
Таким образом, правильный способ получить это число состоит в том, чтобы найти недельное количество первых и последних дней месяца.
Редактирование № 1: вот то, как вычислить число недель данный месяц промежутки: Редактирование № 2: Исправленные ошибки в коде
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;
}
Месяцы в Юлианском / Григорианский календарь имеет то же количество дней каждый год, кроме февраля, у кого может быть 28 или 29 дней в зависимости от leapness года. Можно найти количество дней в разделе Description по http://en.wikipedia.org/wiki/Gregorian_calendar.
Поскольку @darkdog упомянул, что у Вас есть DateTime. DaysInMonth. Просто сделайте это:
var days = DateTime.DaysInMonth(year, month) +
WhatDayOfWeekTheMonthStarts(year, month);
int rows = (days / 7);
if (0 < days % 7)
{
++rows;
}
Учтите то, что для глобализации / цели локализации, некоторые части мира используют различные календари / методы организации года.
Сначала Узнайте, в каком рабочем дне первый день месяца находится. Просто новый дата и время с первым днем, всегда 1, и год и рассматриваемый месяц, существует день недельного свойства на нем.
Затем отсюда можно использовать количество дней в месяце, DateTime.DaysInMonth
, для определения, сколько недель, когда Вы делитесь на семь и затем добавляете количество дней от 1, что Ваш первый день падает на. Например,
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;
}