Как найти номера недели заданного диапазона дат в С#

-6

Мне нужно найти число недель в ядре определенной даты на С#.

Пример: дата между 01/01/2014 и 14/01/2014. Номера недели - 1, 2 и 3 недели, аналогично.

Благодарю.

спросил(а) 2014-08-11T19:09:00+04:00 6 лет, 2 месяца назад
0
58

Не самый умный способ, но работает!

  var d1 = new DateTime(2014, 1, 1);
var d2 = new DateTime(2014, 1, 14);
var currentCulture = CultureInfo.CurrentCulture;
var weeks = new List<int>();

for (var dt = d1; dt < d2; dt =dt.AddDays(1))
{
var weekNo = currentCulture.Calendar.GetWeekOfYear(
dt,
currentCulture.DateTimeFormat.CalendarWeekRule,
currentCulture.DateTimeFormat.FirstDayOfWeek);
if(!weeks.Contains(weekNo))
weeks.Add(weekNo);
}

ответил(а) 2014-08-11T19:30:00+04:00 6 лет, 2 месяца назад
58

Это должно работать:

public List<int> Weeks(DateTime start, DateTime end)
{
List<int> weeks=new List<int>();
var Week=(int)Math.Floor((double)start.DayOfYear/7.0); //starting week number
for (DateTime t = start; t < end; t = t.AddDays(7))
{
weeks.Add(Week);
Week++;
}
return weeks;
}

Все это происходит, когда вы получаете неделю с даты начала, а затем переходите через неделю, пока не дойдете до конечной даты, увеличивая неделю и добавляя ее в список недель.

ответил(а) 2014-08-11T19:27:00+04:00 6 лет, 2 месяца назад
41

Легко. Здесь код, определяющий неделю года для одной даты. Это должно заставить вас идти:

int WeekOfYear(DateTime date, DayOfWeek dayOfWeekStart) {
//Find the first day of the year that the start of week day. If it not 1/1,
//then we have a first partial week.
bool firstPartialWeek = false;
DateTime firstFullWeekStart = new DateTime(date.Year, 1, 1);
while(firstFullWeekStart.DayOfWeekDay != dayOfWeekStart) {
firstFullWeekStart = firstOfWeek.AddDays(1);
firstPartialWeek = true;
}
//Return the week by integer dividing the date difference by seven,
//and adding in the potential first partial week
return (firstPartialWeek ? 1 : 0) + ((date - firstFullWeekStart).TotalDays / 7);

}

ответил(а) 2014-08-11T19:48:00+04:00 6 лет, 2 месяца назад
42

Хорошо, давайте начнем с простого, неоптимизированного примера. Мы просто проверим каждую дату между этими датами и проверим, в какой неделе этого года.

Мы можем сделать это с помощью простого цикла:

var end = new DateTime(2014, 1, 14);
for (var date = new DateTime(2014, 1, 1); date <= end; date = date.AddDays(1))
{
}

Это будет просто циклироваться каждый день между двумя датами. Теперь нам нужно изучить те дни, чтобы определить их день недели. Для этого вам нужно рассмотреть несколько вещей: что такое первый день недели? Воскресенье? Понедельник? Принимаем ли мы грегорианский календарь?

Для нашего примера позвольте предположить, что первый день недели - воскресенье, и мы действительно используем григорианский календарь. Затем мы проверим каждую дату и сохраним список уникальных недель года с помощью HashSet:

var weekNumber = new HashSet<int>();
var end = new DateTime(2014, 1, 14);
var calendar = new GregorianCalendar();
for (var date = new DateTime(2014, 1, 1); date <= end; date = date.AddDays(1))
{
weekNumber.Add(calendar.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Sunday));
}

В weekNumber Hashset теперь есть недели года.

Это оптимизировано? Нет. Он проверяет гораздо больше дат, чем нужно, но реализация проста и достаточно быстро. Оптимизация может быть выполнена как отдельная задача.

ответил(а) 2014-08-11T19:29:00+04:00 6 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема