使用c#visual studio 2008。
任何人都可以帮助算法做到这一点
如果我在本周选择了一系列天数(例如星期一到星期五),我可以使用日期时间函数找到这些日期。
我想要做的是与1年前相同DAY范围的存储数据进行比较。
所以基本上我需要回到1年,找到最近的星期一至星期五的日期,从1年前开始。我想我也需要考虑闰年。
任何人都可以帮助使用合适的算法来实现这一目标。 当然,去年今天的日期不会是同一天。
提前致谢
答案 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内置的单元测试功能,以确保您考虑到极端情况。