Как получить всю рабочую неделю (дни с понедельника по субботу) с нашей текущей даты

Мне нужно получить текущую рабочую неделю из нашего текущего дня. Пример:

22.11.2022 (вторник) должен вернуть мне даты с 21.11.2022(понедельник) - 26.11.2022(суббота)

27.11.2022 (воскресенье) должен вернуть мне на следующей неделе: 28.11.2022(понедельник) - 03.12.2022(суббота).

Я нашел этот вопрос о переполнении стека, но в Java (не очень понимаю, как это перевести на C#): Как найти ближайший день недели для произвольной даты?

Что ж, объект .NET DateTime имеет .DayOfWeek и такие методы, как .AddDays и т. д., так что этого должно быть достаточно для начала. Обратите внимание, что DayOfTheWeek — это перечисление с числовыми значениями (документы). Если вы немного растерялись, попробуйте сделать это на бумаге. Вооружившись только знанием того, что 22 ноября 2022 года — вторник, какое число первого дня недели? Какого числа последний день недели?

ProgrammingLlama 22.11.2022 09:18

Ах, так я только что погуглил, и день недели — это константа int, что означает, что код Java даже не нужно будет корректировать.

koogel 22.11.2022 09:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
58
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это может быть перебор. Но я создал небольшую простую и не требующую пояснений консольную программу для постановки вашей проблемы.

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 23.11.2022 10:45

@koogel - я добавил объяснение к ответу.

Enigmativity 23.11.2022 11:12

Для меня это работает очень хорошо. Дает список рабочих дней недели

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;
}

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

koogel 23.11.2022 10:44

Другие вопросы по теме