Вычислите недели DateTime в строки

Я в настоящее время пишу маленький календарь в ASP.NET C#. В настоящее время для создания строк недель я делаю следующее для цикла:

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

Это хорошо работает, однако, некоторый месяц будет только иметь 5 недель и в некоторых редких случаях, 4.

Как я могу вычислить количество строк, которые будут требоваться в течение конкретного месяца?

Это - пример того, что я создаю:

enter image description here

Как Вы видите в течение вышеупомянутого месяца, существует только 5 требуемых строк, как бы то ни было. Возьмите в этом месяце (август 2008), который запустился в субботу и концы в понедельник в 6-ю Неделю/Строку.

Изображение найдено на Google


Это - пример того, что я создаю:

enter image description here

Как Вы видите в течение вышеупомянутого месяца, существует только 5 требуемых строк, как бы то ни было. Возьмите в этом месяце (август 2008), который запустился в субботу и концы в понедельник в 6-ю Неделю/Строку.

Изображение найдено на Google

7
задан Bohemian 21 December 2016 в 04:38
поделиться

9 ответов

Вот метод, который делает это:

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. Я надеюсь, что код сам объяснительный.

6
ответ дан 7 December 2019 в 05:35
поделиться

Как насчет того, чтобы проверить, в котором будет неделя первые и последние дни?

0
ответ дан 7 December 2019 в 05:35
поделиться

Ну, это зависит от культуры, которую Вы используете, но давайте предположим, что можно использовать Поток. CurrentThread. CurrentCulture, затем код для получения недели сегодня был бы:

Culture culture = Thread.CurrentThread.CurrentCulture;
Calendar cal = culture.Calendar;
Int32 week = cal.GetWeekOfYear(DateTime.Today,
    culture.DateTimeFormat.CalendarWeekRule,
    culture.DateTimeFormat.FirstDayOfWeek);
2
ответ дан 7 December 2019 в 05:35
поделиться

можно получить дни месяца при помощи DateTime. DaysInMonth (международный WhichYear, международный WhichMonth);

0
ответ дан 7 December 2019 в 05:35
поделиться

Проверьте Календарь. GetWeekOfYear. Это должно добиться цели.

Существует проблема с ним, это не следует 4-дневному правилу ISO 8601, но иначе это аккуратно.

0
ответ дан 7 December 2019 в 05:35
поделиться

Проблемой не является количество дней в месяце, это - сколько недель это охватывает.

Февраль в невисокосный год будет иметь 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;
}
0
ответ дан 7 December 2019 в 05:35
поделиться

Месяцы в Юлианском / Григорианский календарь имеет то же количество дней каждый год, кроме февраля, у кого может быть 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;
}  

Учтите то, что для глобализации / цели локализации, некоторые части мира используют различные календари / методы организации года.

0
ответ дан 7 December 2019 в 05:35
поделиться

Сначала Узнайте, в каком рабочем дне первый день месяца находится. Просто новый дата и время с первым днем, всегда 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;
}
0
ответ дан 7 December 2019 в 05:35
поделиться

Попробуйте это,

DateTime.DaysInMonth
0
ответ дан 7 December 2019 в 05:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: