Как получить номер недели?

194
29 марта 2018, 06:11

Нужно получить номер недели. С первой неделей года всё понятно. А если первая неделя будет текущая (26.03 - 01.04) с учётом високосного года. Т.е. предыдущая неделя (19.03 - 25.03) была 52?

Answer 1

Считать недели можно по-разному. Можно считать первой неделю, в которой первое января. Можно считать первой неделю, в которой первый понедельник года. Можно считать первой неделю, бóльшая часть которой принадлежит новому году. Как именно считать — выбирать вам. В .NET за этот выбор отвечает энумерация System.Globalization.CalendarWeekRule.

Получить номер недели по дате можно так:

var dt = new DateTime(2017, 1, 1);
var cal = new GregorianCalendar();
var weekNumber = cal.GetWeekOfYear(dt, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday);
// получается 52

Мы видим, что по правилу «год начинается с полной недели» 1 января 2017 года принадлежит 52-ой неделе прошлого, 2016 года.

Answer 2

Не знаю, правильно ли понял, что вы хотите сделать, но допустим:

У вас есть объект DateTime. Не знаю, как вы его получите, будь то DateTime.Now, DateTime.UtcNow, или как-то еще. Задача в определении того, какая по счету неделя идет для этой даты.

Тогда задача становится тривиальной:

DateTime myDateTime = DateTime.Now;
int firstDayOfYear = (int)new DateTime(myDateTime.Year, 1, 1).DayOfWeek;
int weekNumber = (myDateTime.DayOfYear + firstDayOfYear) / 7;

Тогда переменная weekNumber будет хранить значение, и при этом первая неделя будет 0, вторая - 1 и т.д. Если нужно считать недели, начиная с 1, то просто

int weekNumber = (myDateTime.DayOfYear + firstDayOfYear) / 7 + 1;

Как-то так.

READ ALSO
Триггер на добавление в List<T>

Триггер на добавление в List<T>

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

197
Понимание шифрования данных .net

Понимание шифрования данных .net

Хочу уточнить пару вещей

202
С# взаимодействие потоков

С# взаимодействие потоков

Как реализовать обмен данными между основным циклом и потоками? Допустим есть такой псевдокод Пример:

228