Существует множество схем нумерации недель. Например, ISO-8601 рассчитан на полные недели, поэтому 2016-01-01
- это неделя 53 из 2015 года. Ваш ожидаемый результат показывает, что вы хотите начать отсчет с 1/1, а не с первой полной недели.
Вы можете избежать хлопот, используя библиотеку как NodaTime которая already supports вычислительное дату в год, номер недели и день:
LocalDate date = LocalDate.FromWeekYearWeekAndDay(year, week, IsoDayOfWeek.Monday);
Если вы не хотите использовать внешнюю библиотеку, «Трюк "чтобы найти первую неделю дату начала, добавьте указанное количество недель к нему, а затем, добавьте количество дней, которое соответствует targed дня недели:
var year=2016;
var weekNumber=1;
var dayOfWeek=(int)DayOfWeek.Friday;
//Doesn't really matter when the week starts
var firstDayOfWeek=(int)DayOfWeek.Sunday;
var yearStart=new DateTime(year,1,1);
var firstWeekDate=yearStart.AddDays(firstDayOfWeek -(int)yearStart.DayOfWeek);
//Use Calendar to add the number of weeks
Calendar myCal = CultureInfo.InvariantCulture.Calendar;
var targetDate=myCal.AddWeeks(firstWeekDate,weekNumber-1)
.AddDays(dayOfWeek - firstDayOfWeek);
результат является 2016-1-1
. На 11-й неделе результатом будет 2016-3-11
.
упрощающих для firstWeekDate
код становится:
var targetDate=myCal.AddWeeks(yearStart,weekNumber-1)
.AddDays(dayOfWeek - (int)yearStart.DayOfWeek);
Как функция, которая будет выглядеть так:
DateTime FromWeekYearWeekAndDay(int year, int weekNumber, DayOfWeek dayOfWeek,
CultureInfo cultureInfo=null)
{
cultureInfo=cultureInfo??CultureInfo.InvariantCulture;
Calendar myCal = cultureInfo.Calendar;
var yearStart=new DateTime(year,1,1);
var targetDate=myCal.AddWeeks(yearStart,weekNumber-1)
.AddDays((int)dayOfWeek - (int)yearStart.DayOfWeek);
return targetDate;
}
Заключительная часть разбора название дня. Если вы используете полный английское название дня, вы можете использовать Enum.Parse:
var dayOfWeek=(int)Enum.Parse(typeof(DayOfWeek),"Friday");
Для сокращения, вы можете получить список дат сокращений от собственности DateTimeFormat.AbbreviatedDayNames CultureInfo в. Позиция индекса аббревиатуры соответствует значению DayOfWeek.
Для того, чтобы Lookups проще, вы можете преобразовать этот список в словарь:
var abbreviations=CultureInfo.InvariantCulture.DateTimeFormat.AbbreviatedDayNames;
var dayDict=abbreviations.Select((name,idx)=>new{name,idx})
.ToDictionary(l=>l.name,
l=>(DayOfWeek)l.idx,
StringComparer.InvariantCultureIgnoreCase);
var dayOfWeek= dayDict["FRI"];
В конце концов, вы могли бы найти дату тарг со следующим кодом:
var dayOfWeek=dayDict["FRI"];
var targetDate=FromWeekYearWeekAndDay(2016,1,dayOfWeek);
//2016-01-01
или
var targetDate=FromWeekYearWeekAndDay(2016,11,dayOfWeek);
//2016-3-11
Что это такое? Все ли они? –
На какой неделе вы используете систему нумерации? Есть * много * доступных ... –
@ SonerGönül, hmm все строки – Shohel