Member 1283347 Ответов: 3

Найдите последний четверг месяца между двумя датами C#


Я пытаюсь получить последний четверг каждого месяца между двумя днями. Некоторые из моих результатов верны, другие происходят с опозданием на день по пятницам. Ниже приведен мой код и результаты.
Любая помощь будет оценена по достоинству.

Что я уже пробовал:

public class BusinessWeekDays
        {
            public DateTime StartDateMonth;
            public DateTime EndMonth;
        }      
     
        static void Main(string[] args)
        {
            var StartDate = DateTime.Parse("04/25/2019");
            var SeriesEndDate = DateTime.Parse("09/30/2019");

            var months = new List<businessweekdays>();
            var Monthly = 1;
            for (var i = StartDate; i < SeriesEndDate; i = i.AddMonths(Monthly))
            {
                const int thursday = 4;
                const int dayDiff = 7 - thursday;
                
                var Day = DateTime.DaysInMonth(i.Year, i.Month);
                var DayOfWeek = (int)new DateTime(i.Year, i.Month, Day).DayOfWeek;
                
                var _dtNew = new DateTime(i.Year, i.Month, Day).AddDays(-(DayOfWeek < thursday ? DayOfWeek + dayDiff : DayOfWeek - thursday));
                var e = _dtNew.AddMonths(+1).AddDays(-2);
                months.Add(new BusinessWeekDays{ StartDateMonth = _dtNew, EndMonth = e});
                Console.WriteLine(months);
            }
           }
        }




Результаты:
------------
[0]	 		
		StartDateMonth	{4/25/2019 12:00:00 AM}	System.DateTime  ----->Correct Date and Day
		EndMonth	{5/23/2019 12:00:00 AM}	System.DateTime
		[1]	 
		StartDateMonth	{5/30/2019 12:00:00 AM}	System.DateTime -----Incorrect Date and Day Friday 
		EndMonth	{6/28/2019 12:00:00 AM}	System.DateTime
		
		[2]	
        StartDateMonth	{6/27/2019 12:00:00 AM}	System.DateTime		
		EndMonth	{7/25/2019 12:00:00 AM}	System.DateTime -----> Correct Date and day 
		
		[3]	 
		StartDateMonth	{7/25/2019 12:00:00 AM}	System.DateTime
		EndMonth	{8/23/2019 12:00:00 AM}	System.DateTime ---Incorrect Date and day
		
		[4]	 
		StartDateMonth	{8/29/2019 12:00:00 AM}	System.DateTime
		EndMonth	{9/27/2019 12:00:00 AM}	System.DateTime ---- Incorrect Date and Day

3 Ответов

Рейтинг:
25

Maciej Los

Запрос linq (lambda), который "находит" последние четверги месяцев между двумя датами:

int datediff = (SeriesEndDate - StartDate).Days+1;
var lastThursdaysBetweenDates = Enumerable.Range(0, datediff)
    .Select(x=>StartDate.AddDays(x))
    .Where(d=> d.DayOfWeek==DayOfWeek.Thursday)
    .GroupBy(d=>d.Month)
    .Select(grp=>grp.Max(d=>d));


Удачи вам!


Рейтинг:
1

OriginalGriff

Вы можете посмотреть здесь: Расширения DateTime, чтобы сделать некоторые простые задачи немного более читабельными[^] - это может не решить вашу проблему точно, но это даст вам базу для работы - она включает в себя "последнее ...день месяца" метод, который вы могли бы довольно легко изменить.


Рейтинг:
0

Patrice T

Цитата:
Некоторые из моих результатов верны, другие происходят с опозданием на день по пятницам.

Может быть, Ваша оценка правильности результата тоже неверна.
Цитата:
StartDateMonth {4/25/2019 12:00:00 AM} System.DateTime ----->Correct Date and Day
EndMonth {5/23/2019 12:00:00 AM} System.DateTime

Последний четверг мая-30, а не 23 !
Проверьте эту часть
var e = _dtNew.AddMonths(+1).AddDays(-2);

Месяцы имеют разное количество дней!

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

Отладка кода C# в Visual Studio - YouTube[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Member 1283347

Я знаю, что моя проблема не в том, что я не отлаживаю свой код. Может быть, я не очень хорошо объясняю свою проблему. Код может дать мне последний четверг каждого месяца между двумя датами правильно.
Что я хочу сделать дальше, так это просто отобразить дату начала и дату окончания каждого месяца между этими двумя днями. Вот тут-то у меня и возникла проблема.
Эта часть моего кода: var e = _dtNew.AddMonths(+1).AddDays(-2);
месяцы.Добавить(new BusinessWeekDays{ StartDateMonth = _dtNew, EndMonth = e});
это просто для того, чтобы показать дату начала и окончания каждого месяца. Я знаю, что здесь я не совсем правильно понимаю, поэтому и прошу о помощи. Без этих двух строк код дает мне правильный последний четверг каждого месяца.