Мне нужно получить текущую рабочую неделю из нашего текущего дня. Пример:
22.11.2022 (вторник) должен вернуть мне даты с 21.11.2022(понедельник) - 26.11.2022(суббота)
27.11.2022 (воскресенье) должен вернуть мне на следующей неделе: 28.11.2022(понедельник) - 03.12.2022(суббота).
Я нашел этот вопрос о переполнении стека, но в Java (не очень понимаю, как это перевести на C#): Как найти ближайший день недели для произвольной даты?
Ах, так я только что погуглил, и день недели — это константа int, что означает, что код Java даже не нужно будет корректировать.





Это может быть перебор. Но я создал небольшую простую и не требующую пояснений консольную программу для постановки вашей проблемы.
static void Main(string[] args)
{
Console.WriteLine("Enter the date for finding the List of WrokWeek in mm/dd/yyyy. If you do not eneter any date. Today's date will be taken by default");
string inputDate = Console.ReadLine();
DateTime parsedInputDateTime = DateTime.UtcNow;
DateTime.TryParse(inputDate, out parsedInputDateTime);
DateTime inputDateInDateTime = parsedInputDateTime != DateTime.MinValue ? parsedInputDateTime : DateTime.UtcNow;
// Now we find out the Day of the week from the input Date
var dayOfWeekForInputDate = inputDateInDateTime.DayOfWeek;
// Just find the Nearest Sunday (Day=0) in the past
int nearestSundayDiff = dayOfWeekForInputDate != DayOfWeek.Sunday ? dayOfWeekForInputDate - DayOfWeek.Sunday : 0;
// Now using the difference value we basically know how far we have to subtract to reach Sunday
// When we reach Sunday we add one more day to get Monday and rest is knida self-explanatory
DateTime nearestSunday = inputDateInDateTime.AddDays(-nearestSundayDiff);
DateTime currentDay = nearestSunday.AddDays(1);
// Just Loop through the days and print out the week dates from Monday to Saturday
while (currentDay.DayOfWeek != DayOfWeek.Sunday)
{
string s = currentDay.ToString("dd/M/yyyy", CultureInfo.InvariantCulture);
Console.WriteLine(currentDay.DayOfWeek.ToString() + " : " + s);
currentDay = currentDay.AddDays(1);
}
Console.ReadKey();
}
Эта консольная программа принимает строку в формате мм/дд/гггг и анализирует ее в бэкэнде. Если формат неверен или дата не введена, он просто принимает текущую дату и время UTC.
Затем мы в основном пытаемся найти ближайшее воскресенье, так как его интегральное значение равно 0 в C#. Затем мы просто переходим к субботе и распечатываем результат. Я бы не советовал считать этот код достойным, так как я написал его за 5 минут и, безусловно, могу придумать по крайней мере 3-4 вещи, которые я могу сделать, чтобы предотвратить ошибки и т. д. Не стесняйтесь комментировать ошибки.
Вот ответ, когда я вошел 02.12.2022
Надеюсь, это ответит на ваш запрос. Хорошего дня
Это все, что вам нужно:
(DateTime start, DateTime end) GetWorkingWeek(DateTime fromDate)
{
var start = fromDate.Date.AddDays(1.0 - (int)fromDate.DayOfWeek);
var end = start.AddDays(5.0);
return (start: start, end: end);
}
fromDate.Date убирает время с DateTime. DayOfWeek — это перечисление, состоящее из чисел от 0 для воскресенья до 6 для субботы, поэтому преобразование DayOfWeek в int и вычитание этого количества дней из fromDate.Date возвращает дату к воскресенью. 1 добавляет день к понедельнику. Затем добавление 5 дает субботу.
Теперь из вашего примера ввода:
DateTime[] fromDates = new[]
{
new DateTime(2022, 11, 22),
new DateTime(2022, 11, 27),
};
(DateTime start, DateTime end)[] workingWeeks =
fromDates
.Select(GetWorkingWeek)
.ToArray();
Это дает:
Не могли бы вы объяснить синтаксис, я действительно не понимаю.
@koogel - я добавил объяснение к ответу.
Для меня это работает очень хорошо. Дает список рабочих дней недели
public List<DateTime> GetWorkingDaysOfWeek(DateTime date)
{
List<DateTime> workingDays = new List<DateTime>();
date = date.AddDays(-(date.Date.DayOfWeek.GetHashCode() - 1));
for (int i = 0; i < 7; i++)
{
workingDays.Add(date.AddDays(i));
}
return workingDays;
}
Это отлично работает, я все еще проверяю все ответы, я немного изменил ваш код, чтобы он не учитывал воскресенье. Также сделал для него метод расширения.
Что ж, объект .NET
DateTimeимеет.DayOfWeekи такие методы, как.AddDaysи т. д., так что этого должно быть достаточно для начала. Обратите внимание, чтоDayOfTheWeek— это перечисление с числовыми значениями (документы). Если вы немного растерялись, попробуйте сделать это на бумаге. Вооружившись только знанием того, что 22 ноября 2022 года — вторник, какое число первого дня недели? Какого числа последний день недели?