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