Получить список дат из номера недели c # - PullRequest
1 голос
/ 21 марта 2012

У меня есть функция, которая получает текущий номер недели от указанной даты.

Например,

GregorianCalendar cal = new GregorianCalendar(GregorianCalendarTypes.Localized);
return cal.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

возвращает номер недели 40 для DateTime.Now.

Так что мой вопросЭто также моя проблема, мне нужно, чтобы получить даты на возвращенной неделе.Я пробовал несколько вещей, и ни один из них не работал.

Ответы [ 3 ]

4 голосов
/ 21 марта 2012

Вы можете использовать класс Неделя из библиотеки периодов времени для .NET :

Week week = new Week( new DateTime( 2012, 03, 21 ) );
Console.WriteLine( "week #: ", week.WeekOfYear );
Console.WriteLine( "week first day: ", week.FirstDayOfWeek );
Console.WriteLine( "week last day: ", week.LastDayOfWeek );

Дополнительно, Неделя класса поддерживает нумерацию недели ISO 8601 и пользовательские культуры.

1 голос
/ 21 марта 2012

Вы можете использовать эту функцию, чтобы получить первую дату недели:

public static DateTime FirstDateOfWeek(int year, int weekOfYear)
{
    DateTime jan1 = new DateTime(year, 1, 1);
    int daysOffset = Convert.ToInt32(System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek) - Convert.ToInt32(jan1.DayOfWeek);
    DateTime firstWeekDay = jan1.AddDays(daysOffset);
    System.Globalization.CultureInfo curCulture = System.Globalization.CultureInfo.CurrentCulture;
    int firstWeek = curCulture.Calendar.GetWeekOfYear(jan1, curCulture.DateTimeFormat.CalendarWeekRule, curCulture.DateTimeFormat.FirstDayOfWeek);
    if (firstWeek <= 1) {
        weekOfYear -= 1;
    }
    return firstWeekDay.AddDays(weekOfYear * 7);
}

Тогда вы можете получить все даты на этой неделе следующим образом:

var firstDate = FirstDateOfWeek(2012, 40);
var allWeekDays = new List<DateTime>();
allWeekDays.Add(firstDate);
var currentDate = firstDate;
for(int d = 1; d < 7; d++)
{
    currentDate=currentDate.AddDays(1);
    allWeekDays.Add(currentDate);
}

или в одну строку:

var week = Enumerable.Range(0,7).Select(d => firstDate.AddDays(d)).ToList();
1 голос
/ 21 марта 2012

Вы можете получить первый и последний день недели, просто посмотрев на день недели с указанной датой, и найдите понедельник:

DateTime firstDay = date.Date;
while (firstDay.DayOfWeek != DayOfWeek.Monday) {
  firstDay = date.AddDays(-1);
}
DateTime lastDay = firstDay.AddDays(6);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...