c # найти тот же диапазон "именных дней" от 1 года назад - PullRequest
3 голосов
/ 10 февраля 2010

с использованием c # visual studio 2008.

Может кто-нибудь помочь с алгоритмом, чтобы сделать это, пожалуйста

Если для этой недели выбран диапазон дней (например, с понедельника по пятницу), я могу найти даты для них, используя доступные функции datetime.

То, что я хочу сделать, сравнивается с сохраненными данными для того же диапазона ДНЯ 1 год назад.

Итак, в общем, мне нужно вернуться на 1 год назад и найти даты ближайшего понедельника-пятницы в диапазоне от 1 года назад. Думаю, мне также нужно учитывать високосные годы.

Может кто-нибудь помочь с подходящим алгоритмом, как этого добиться. Конечно, ДЕНЬ сегодняшней даты в прошлом году не будет тем же днем.

заранее спасибо

Ответы [ 5 ]

1 голос
/ 10 февраля 2010

Вот код, который может делать то, что вы хотите - но тестовые примеры показывают, что есть угловые случаи, которые следует учитывать:

using System;

public class Test
{
    static void Main()
    {
        Console.WriteLine(SameDayLastYear(DateTime.Today));
        Console.WriteLine(SameDayLastYear(new DateTime(2010, 12, 31)));
    }

    static DateTime SameDayLastYear(DateTime original)
    {
        DateTime sameDate = original.AddYears(-1);
        int daysDiff = original.DayOfWeek - sameDate.DayOfWeek;
        return sameDate.AddDays(daysDiff);
    }
}

Каким вы хотели бы получить результат для второго вызова? Этот код возвращает 1 января 2010 года, поскольку это самая близкая дата к «год назад в тот же день».

Я настоятельно рекомендую, чтобы у вас были единичные тесты, проверяющие високосные годы, начало и конец года и т. Д.

0 голосов
/ 10 февраля 2010

Это было довольно весело.

        // today's info
        DateTime today = DateTime.Now;
        DayOfWeek today_name = today.DayOfWeek;
        // this day one year ago
        DateTime year_ago = today - new TimeSpan( ((today.Year - 1) % 4) ? 365 : 366, 0, 0, 0);
        // find the closest day to today's info's name
        DayOfWeek today_name_a_year_ago = year_ago.DayOfWeek;
        DateTime current_range_a_year_ago = year_ago - new TimeSpan( year_ago.DayOfWeek - today_name, 0, 0, 0);
        Console.WriteLine( "Today is {0}, {1}", today_name, today);
        Console.WriteLine( "One year from today was {0}, {1}", today_name_a_year_ago, year_ago);
        Console.WriteLine( "New date range is {0}", current_range_a_year_ago);

Я бы настоятельно рекомендовал использовать функции модульного тестирования, встроенные в VS2008, чтобы убедиться, что вы учитываете угловые случаи.

0 голосов
/ 10 февраля 2010
    DateTime now = DateTime.Now;
    DateTime lastyear = now.AddYears(-1);

    string dayOfWeek = lastyear.DayOfWeek.ToString();

    if (dayOfWeek.Equals("Saturday")) { dayOfWeek = "Friday"; }
    else if (dayOfWeek.Equals("Sunday")) { dayOfWeek = "Monday"; }

    Console.WriteLine(dayOfWeek);
    Console.ReadKey();

Получите объект datetime за последний год, затем используйте свойство DayOfWeek.

0 голосов
/ 10 февраля 2010

Я только вычитал один год, затем бегал назад, пока не нашел понедельник. LastYear будет первым понедельником до этой даты в прошлом году

DateTime LastYear = DateTime.Now.AddYears(-1)
DayOfWeek Check = LastYear.DayOfWeek;
while (Check != DayOfWeek.Monday)
{
    LastYear = LastYear.addDays(-1);
    Check = LastYear.DayOfWeek;
}
Console.WriteLine("{0}",LastYear);
0 голосов
/ 10 февраля 2010

Допустим, вы выбрали среду 10-02-2010 - пятницу 12-02-2010 в этом году. В прошлом году это был вторник 10-02-2009 - четверг 12-02-2009.

Таким образом, вы можете сделать следующее: вернуться на год, просто выполнив DateTime.AddYears (-1). Убедитесь, что вы исправили високосные годы здесь.

Затем вы используете .AddDays (1), пока не окажетесь на таймфрейме среда - пятница. Таким образом, вам нужно учитывать только високосные годы в одном месте, и это должно дать нужный вам результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...