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

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

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

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

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

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

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

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

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

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

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

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

@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 

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

  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 дней считались первой неделей, даже если месяц не начинается в воскресенье:

 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; } } 
 public int WeekCalc(DateTime dt) { CultureInfo ciCurr = CultureInfo.CurrentCulture; int weekNum = ciCurr.Calendar.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); return weekNum; } 

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

 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» для этой даты.

Когда у вас есть 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; } } 

Что-то простое … 🙂

 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; } } 
  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) 
  • Глобально конвертировать UTC DateTimes в пользовательские локальные DateTimes
  • Как добавить один день к дате?
  • Как получить столбец datetime в SQLite с Objective C
  • Алгоритм нечеткой даты в Objective-C
  • Изменить часовой пояс в объекте POSIXct
  • Преобразование многих форматов даты-времени в один стандартный формат
  • MySQL - как разбирать строковое значение в формате DATETIME внутри инструкции INSERT?
  • Каков наилучший способ конвертировать секунды в (час: минуты: секунды: миллисекунды)?
  • Как предотвратить ifelse () от превращения объектов Date в числовые объекты
  • Как отформатировать DateTime в PowerShell?
  • Можете ли вы определить часовой пояс из переменных запроса?
  • Interesting Posts

    Имеет ли смысл преобразовывать файл в более высокий битрейт аудио?

    Как использовать определения в схеме JSON (draft-04)

    Как включить JAR-зависимость в библиотеку AAR

    Определить все объекты данного classа для дальнейшей обработки

    Какой самый надежный способ получить компьютер Windows 8 / 8.1 в меню дополнительных параметров запуска?

    Должен ли я использовать .done () и .fail () для нового кода jQuery AJAX вместо успеха и ошибки

    @Id @GeneratedValue, но установите собственное значение ID

    Как использовать ASP.NET Identity 2.0, чтобы позволить пользователю олицетворять другого пользователя?

    Диалог с прозрачным фоном в Android

    Поиск установки домашнего наблюдения по умеренной цене

    Удаление пароля BIOS на ноутбуке Dell

    SqlException из Entity Framework – новая транзакция не допускается, поскольку в сеансе есть другие streamи

    Библиотека больших чисел в c ++

    Почему strcmp () возвращает 0, когда его входы равны?

    Настройки отправки электронной почты с localhost для PHP-кода в Windows Vista

    Давайте будем гением компьютера.