Подтвердить что ты не робот

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

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

Ближе всего я нашел Calendar.GetWeekOfYear, который почти есть.

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

4b9b3361

Ответ 1

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

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 в соответствии с вашими потребностями.

Ответ 2

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

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

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

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

Ответ 3

Название вводит в заблуждение. Вопрос действительно о номере календаря (номер недели, если вы подсчитали строки в календаре) месяца, а не фактический номер недели.

За номер недели месяца вы можете использовать:

VB:
    Function WeekNumber(TargetDate As Date) As Integer
        Return (TargetDate.Day - 1) \ 7 + 1
    End Function

C#:
    public int WeekNumber(DateTime TargetDate)
    {
        return (TargetDate.Day - 1) / 7 + 1;
    }

Ответ 4

Как указано здесь: 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 не дает определения для "Недели месяца".

Ответ 5

@Svish

Версия VB:

Public Shared Function GetWeekNumber(ByVal [date] As DateTime) As Integer
    Return GetWeekNumber([date], CultureInfo.CurrentCulture)
End Function

Public Shared Function GetWeekNumber(ByVal [date] As DateTime, ByVal culture As CultureInfo) As Integer
    Return culture.Calendar.GetWeekOfYear([date], culture.DateTimeFormat.CalendarWeekRule, culture.DateTimeFormat.FirstDayOfWeek)
End Function

Public Shared Function GetWeekNumberOfMonth(ByVal [date] As DateTime) As Integer
    Return GetWeekNumberOfMonth([date], CultureInfo.CurrentCulture)
End Function

Public Shared Function GetWeekNumberOfMonth(ByVal [date] As DateTime, ByVal culture As CultureInfo) As Integer
    Return GetWeekNumber([date], culture) - GetWeekNumber(New DateTime([date].Year, [date].Month, 1), culture) + 1
    ' Or skip +1 if you want the first week to be 0.
End Function

Ответ 6

Это мое решение:

    static string GetWeekNumber()
    {

        var weekNumber = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstFourDayWeek,
            DayOfWeek.Sunday) -
        CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now.AddDays(1 - DateTime.Now.Day),
            CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday) + 1;

        switch (weekNumber)
        {
            case 1 :
                return "First";
            case 2:
                return "Second";
            case 3:
                return "Third";
            default:
                return "Fourth";
        }
    }

Ответ 7

Это старый поток, но мне нужно что-то вроде этого, и это то, что я придумал.

public static int WeekOfMonth(this DateTime date)
{
    DateTime firstDayOfMonth = new DateTime(date.Year, date.Month, 1);
    int firstDay = (int)firstDayOfMonth.DayOfWeek;
    if (firstDay == 0)
    {
        firstDay = 7;
    }
    double d = (firstDay + date.Day - 1) / 7.0;
    return (int)Math.Ceiling(d);
}

Примечание. Это должно работать, если вы хотите использовать понедельник в качестве первого дня недели. Если вы хотите, чтобы неделя началась в воскресенье, это закончилось неудачей во второй неделе марта 2015 года и, возможно, в других датах. Понедельник 9 марта 2015 года - первый день второй недели. Вышеприведенный расчет возвращает "3" для этой даты.

Ответ 8

public int WeekCalc(DateTime dt)
{
    CultureInfo ciCurr = CultureInfo.CurrentCulture;
    int weekNum = ciCurr.Calendar.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    return weekNum;
}

Ответ 9

Как только у вас есть DayOfWeek в первый день месяца, вы можете получить неделю месяца, используя целочисленную арифметику.

static class DateTimeExtensions
{
    // Assumes that in current culture week starts on Sunday
    public static int GetWeekOfMonth(this DateTimeOffset time)
    {
        DateTimeOffset first = new DateTimeOffset(time.Year, time.Month, 1, 0, 0, 0, time.Offset);
        int firstSunday = (7 - (int)first.DayOfWeek) % 7 + 1;
        int weekOfMonth = 1 + (time.Day + 7 - firstSunday) / 7;

        return weekOfMonth;
    }
}

Ответ 10

Что-то простое...:)

private int WeeksNumber()
        {
            int daysInMonth = DateTime.DaysInMonth(YourYear, YourMonth);
            DateTime date = new DateTime(Year, Month, 1);
            switch (daysInMonth)
            {
                case 28:
                    {
                        if (date.DayOfWeek == DayOfWeek.Monday)
                        {
                            return 4;
                        }
                        else
                        {
                            return 5;
                        }
                    }
                case 29:
                    {
                        return 5;
                    }
                case 30:
                    {
                        if (date.DayOfWeek == DayOfWeek.Sunday)
                        {
                            return 6;
                        }
                        else
                        {
                            return 5;
                        }
                    }
                case 31:
                    {
                        if (date.DayOfWeek == DayOfWeek.Sunday || date.DayOfWeek == DayOfWeek.Saturday)
                        {
                            return 6;
                        }
                        else
                        {
                            return 5;
                        }
                    }
                default: return 5;
            }
        } 

Ответ 11

Вот простой вариант, если вы хотите, чтобы первые 7 дней считались первой неделей, даже если месяц не начинается в воскресенье:

class Program
{
    static void Main(string[] args)
    {
        var dates = Enumerable.Range(0, 10)
            .Select(r => new DateTime(2015, 10, 1).AddDays(r))
            .Select(q => new { Date = q, WeekOfMonth = q.WeekOfMonth() });

        foreach(var item in dates)
        {
            Console.WriteLine("Date: {0:ddd MM-dd-yyyy}, WOM: {1}", item.Date, item.WeekOfMonth);
        }

        var final = Console.ReadLine();
    }
}

public static class DateTimeExtensions
{
    public static int WeekOfMonth(this DateTime d)
    {
        var isExact = (d.Day % 7 == 0);
        var offset = isExact ? 0 : 1;
        return (int)Math.Floor(d.Day / 7.0) + offset;
    }
}

Ответ 12

  Dim mdt As Date = txtDT.Text
    Dim weekNum As Integer = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(mdt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday) - CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(GetFirstDayOfMonth(mdt), CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday) + 1
    Response.Write(weekNum)