c#从1年前找到相同范围的“命名天”

时间:2010-02-10 06:14:34

标签: c# winforms datetime

使用c#visual studio 2008。

任何人都可以帮助算法做到这一点

如果我在本周选择了一系列天数(例如星期一到星期五),我可以使用日期时间函数找到这些日期。

我想要做的是与1年前相同DAY范围的存储数据进行比较。

所以基本上我需要回到1年,找到最近的星期一至星期五的日期,从1年前开始。我想我也需要考虑闰年。

任何人都可以帮助使用合适的算法来实现这一目标。 当然,去年今天的日期不会是同一天。

提前致谢

5 个答案:

答案 0 :(得分:1)

这里有一些可能做你想做的代码 - 但是测试用例表明有一些需要考虑的案例:

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

您想要第二次通话的结果是什么?此代码返回2010年1月1日,因为这是“一年前在同一天”的最接近日期。

我强烈建议,无论你使用什么,你都有单元测试来检查闰年,开始和结束等。

答案 1 :(得分:0)

假设您选择2010年10月10日星期三 - 2010年12月12日星期五。 去年那个星期二10-02-2009 - 2009年12月12日星期四。

因此,您可以执行以下操作:只需执行DateTime.AddYears(-1)即可返回一年。确保你在这里纠正闰年。

然后你使用.AddDays(1),直到你在星期三到星期五的时间框架结束。 这样你只需要在一个点上考虑闰年,这应该产生你需要的结果。

答案 2 :(得分:0)

我只是减去了一年,然后向后跑,直到我找到一个星期一。 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);

答案 3 :(得分:0)

    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属性。

答案 4 :(得分:0)

这非常有趣。

        // 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内置的单元测试功能,以确保您考虑到极端情况。