Расчитать текущую неделю по одной дате календаря

Рейтинг: 1Ответов: 2Опубликовано: 26.05.2023

выбирая дату на календаре, необходимо показать текущую неделю. (условно пользователь может выбрать среду => показываем с понедельника по субботу)

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

public void SomeMethode()
{
..............................
var currentMonday = DateValue?.AddDays(-(((int)DateValue?.DayOfWeek + 6) % 7)); //✅
var currentSaturd = DateValue?.AddDays(+(((int)DateValue?.DayOfWeek - 6) % 7)); //❌
...................
//я подумала просто поменяю наоборот...
}

DateValue = это дата выбранная пользователем на календаре.

Ответы

▲ 2Принят

Такое лучше привязывать к культуре, ибо у разных стран есть свои особенности.

Что-то вроде этого:

var dateValue = DateTime.Today; // Текущая дата без времени
var culture = CultureInfo.CurrentCulture; // Текущая культура
var weekOffset = culture.DateTimeFormat.FirstDayOfWeek - dateValue.DayOfWeek; // Разница между началом недели, и текущим днем.
var startOfWeek = dateValue.AddDays(weekOffset); // Получаем дату начала недели указанной даты

Имея это уже можем делать что хотим, например, получить все даты текущей недели:

var weekDays = Enumerable.Range(0, 7).Select(i => startOfWeek.AddDays(i)); // На 26 мая (Россия) выдаст с 22 по 28 включительно.
▲ 0
var currentMonday = DateValue?.AddDays(-(((int)DateValue?.DayOfWeek + 6) % 7));
var currentSaturd = currentMonday?.AddDays(5); 

вот еще может кому пригодится такое интересное решение, //там и другие расчеты дат

public static partial class DateTimeExtensions
{
    public static DateTime FirstDayOfWeek(this DateTime dt)
    {
        var culture = System.Threading.Thread.CurrentThread.CurrentCulture;
        var diff = dt.DayOfWeek - culture.DateTimeFormat.FirstDayOfWeek;

        if (diff < 0)
        {
            diff += 7;
        }

        return dt.AddDays(-diff).Date;
    }

    public static DateTime LastDayOfWeek(this DateTime dt) =>
        dt.FirstDayOfWeek().AddDays(6);
    public static DateTime LastSaturdayOfWeek(this DateTime dt) =>
            dt.FirstDayOfWeek().AddDays(5);
    public static DateTime FirstDayOfMonth(this DateTime dt) =>
            new DateTime(dt.Year, dt.Month, 1);

    public static DateTime LastDayOfMonth(this DateTime dt) =>
        dt.FirstDayOfMonth().AddMonths(1).AddDays(-1);

    public static DateTime FirstDayOfNextMonth(this DateTime dt) =>
        dt.FirstDayOfMonth().AddMonths(1);
}