Вычислите неделю месяца в.NET

Библиотеки.NET имеют простой способ возвратить недельное число для данной даты? Например, вход Year = 2010, Month = 1, Day = 25, должен произвести 5 для недельного числа.

Самый близкий я нашел, был Calendar.GetWeekOfYear, который является почти там.

Java имеет формат "W" строки даты, который возвращает неделю в месяце, но я не вижу ничего эквивалентного в.NET.

40
задан jason 4 February 2010 в 17:19
поделиться

3 ответа

Как указано здесь: http://forums.asp.net/t/1268112.aspx

можно использовать:

public static int Iso8601WeekNumber(DateTime dt)
{
    return  CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}

public static int GetWeekOfMonth(DateTime dt)
{    

    int weekOfYear = Iso8601WeekNumber(dt);

    if (dt.Month == 1)
    {
        //week of year == week of month in January
        //this also fixes the overflowing last December week
        return weekOfYear;
    }

    int weekOfYearAtFirst = Iso8601WeekNumber(dt.AddDays(1 - dt.Day));
    return weekOfYear - weekOfYearAtFirst + 1;
}

Обратите внимание, что ваши потребности могут меняться, поскольку существуют определенные алгоритмические варианты. Т.е. неделя с понедельником-пятницей в конце февраля также является первой неделей марта, или какие критерии определяют «первую» неделю месяца? Стандарт ISO 8601:2004 не содержит определения «Неделя месяца».

-121--1238514-

Можете ли вы не просто определить его позже? Когда вы хотите, чтобы изменение попытаться просто переопределить его как:

a = function() { return 2; }
-121--976350-

Нет встроенных путей для этого, но вот метод расширения, который должен сделать работу для вас:

static class DateTimeExtensions {
    static GregorianCalendar _gc = new GregorianCalendar();
    public static int GetWeekOfMonth(this DateTime time) {
        DateTime first = new DateTime(time.Year, time.Month, 1);
        return time.GetWeekOfYear() - first.GetWeekOfYear() + 1;
    }

    static int GetWeekOfYear(this DateTime time) {
        return _gc.GetWeekOfYear(time, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
    }
}

Использование:

DateTime time = new DateTime(2010, 1, 25);
Console.WriteLine(time.GetWeekOfMonth());

Вывод:

5

Вы можете изменить GetWeekOfYear в соответствии с вашими потребностями.

60
ответ дан 27 November 2019 в 01:11
поделиться

Как указано здесь: http://forums.asp.nest/t/1268112.aspx

Вы можете использовать:

public static int Iso8601WeekNumber(DateTime dt)
{
    return  CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}

public static int GetWeekOfMonth(DateTime dt)
{    

    int weekOfYear = Iso8601WeekNumber(dt);

    if (dt.Month == 1)
    {
        //week of year == week of month in January
        //this also fixes the overflowing last December week
        return weekOfYear;
    }

    int weekOfYearAtFirst = Iso8601WeekNumber(dt.AddDays(1 - dt.Day));
    return weekOfYear - weekOfYearAtFirst + 1;
}

Примечание. Считается, что ваши потребности могут варьироваться в зависимости от того, что есть определенные алгоритмические варианты. Я Неделя с понедельниками в пятницу в конце февраля также первая неделя марта или какие критерии определяют «первую» неделю месяца? ISO 8601: 2004 не дает определения для «недели месяца».

5
ответ дан 27 November 2019 в 01:11
поделиться

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

public static int GetWeekNumber(this DateTime date)
{
    return GetWeekNumber(date, CultureInfo.CurrentCulture);
}

public static int GetWeekNumber(this DateTime date, CultureInfo culture)
{
    return culture.Calendar.GetWeekOfYear(date,
        culture.DateTimeFormat.CalendarWeekRule,
        culture.DateTimeFormat.FirstDayOfWeek);
}

Мы можем затем использовать, что для расчета номера недели на основе месяца, вроде Джейсон показывает Отказ Удобная культура, дружеская версия может выглядеть что-то подобное:

public static int GetWeekNumberOfMonth(this DateTime date)
{
    return GetWeekNumberOfMonth(date, CultureInfo.CurrentCulture);
}

public static int GetWeekNumberOfMonth(this DateTime date, CultureInfo culture)
{
    return date.GetWeekNumber(culture)
         - new DateTime(date.Year, date.Month, 1).GetWeekNumber(culture)
         + 1; // Or skip +1 if you want the first week to be 0.
}
21
ответ дан 27 November 2019 в 01:11
поделиться
Другие вопросы по тегам:

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