Вычислить неделю месяца в .NET.
У библиотеки .NET есть простой способ вернуть номер недели для данной даты? Например, ввод Year = 2010, Month = 1, Day = 25
, должен выводить 5
для номера недели.
Ближе всего я нашел Calendar.GetWeekOfYear
, который почти есть.
Java имеет формат строки даты "W", который возвращает неделю в месяце, но я не вижу ничего эквивалентного в .NET.
Ответы
Ответ 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)