这是一个非常具体的问题,我需要在C#.NET中过去6个星期五的日期。目前,我们正在通过一个SQL数据库来完成此任务,该数据库的表格中包含了一年中星期五的日期。
这有两个问题,
1)当我非常肯定C#可以做到这一点时,对数据库似乎是一个不必要的查询。
2)我必须记得在年底加入明年。
我已经浏览过网络了,我确定某个地方有一个帖子可以清楚地显示答案,但我似乎无法找到它!
我希望有人可以帮我解决这个问题的代码。
非常感谢提前!
答案 0 :(得分:5)
主要想法是选择今天的第一个星期五,一次选择一个星期:
var now = DateTime.Now;
DateTime nearestFridayBeforeToday;
if(now.DayOfWeek != DayOfWeek.Friday)
{
nearestFridayBeforeToday = now.AddDays(DayOfWeek.Friday - now.DayOfWeek) //returns first friday after today
.AddDays(-7); //so we need to subtract one week
}
else
{
nearestFridayBeforeToday = now;
}
var sixFridaysBeforeNow = Enumerable.Range(0, 6)
.Select(n => nearestFridayBeforeToday.AddDays(-7 * n));
//print results
var r = sixFridaysBeforeNow.Select(d => string.Format("{0} : {1}", d, d.DayOfWeek));
Console.WriteLine (string.Join(Environment.NewLine, r));
打印:
6/21/2013 3:37:52 PM : Friday
6/14/2013 3:37:52 PM : Friday
6/7/2013 3:37:52 PM : Friday
5/31/2013 3:37:52 PM : Friday
5/24/2013 3:37:52 PM : Friday
5/17/2013 3:37:52 PM : Friday
答案 1 :(得分:3)
DateTime
结构有一个名为DayOfWeek
的属性。它是一个枚举,告诉您与DateTime
的实例对应的星期几。
所以你可以写一些像这样的代码:
List<DateTime> sixFridays = new List<DateTime>();
DateTime foo = DateTime.Today;
while (sixFridays.Count < 6) {
if (foo.DayOfWeek == DayOfWeek.Friday) sixFridays.Add(foo);
foo = foo.AddDays(-1);
}
今天之前你会得到六个星期五。如果你想在今天之后的六个星期五,只需在循环中添加1天而不是-1。
List<DateTime> sixFridays = new List<DateTime>();
DateTime foo = DateTime.Today;
while (foo.DayOfWeek != DayOfWeek.Friday) {
foo = foo.AddDays(-1);
}
for (int i = 0; i < 6; foo.AddDays(-7)) {
sixFridays.Add(foo);
i++; // I don't remember if you could place this together with foo.AddDays(-7) in the last part of the command.
}
已编辑,因为OP表示他希望将当天包含在星期五以及今天的六个星期五之前。
答案 2 :(得分:2)
这是您可以使用的扩展方法。
public static IEnumerable<DateTime> Last(this DayOfWeek dow, int count)
{
var today = DateTime.Today;
var adjustment = today.DayOfWeek - dow + (dow > today.DayOfWeek ? 7 : 0);
return Enumerable.Range(0, count)
.Select(x => today.AddDays(x * -7 - adjustment));
}
这样称呼:
var last6Fridays = DayOfWeek.Friday.Last(6);
例如:
var last6Fridays = DayOfWeek.Friday.Last(6);
var formatted = string.Join(Environment.NewLine,
last6Fridays.Select(x => x.ToLongDateString()));
Console.WriteLine(formatted);
<强>输出:强>
2013年6月21日星期五
2013年6月14日星期五
2013年6月7日星期五
2013年5月31日星期五
2013年5月24日,星期五
2013年5月17日,星期五
答案 3 :(得分:1)
你也可以尝试这个
private List<DateTime> GetLastFridays()
{
List<DateTime> lstLastFridays = new List<DateTime>();
TimeSpan oTimeSpan = new TimeSpan(((int)DateTime.Now.DayOfWeek + 2), 0, 0, 0, 0);
DateTime dt = DateTime.Now.Subtract(oTimeSpan);
lstLastFridays.Add(dt);
for (int count = 0; count < 6; count++)
{
dt = dt.Subtract(new TimeSpan(7, 0, 0, 0, 0));
lstLastFridays.Add(dt);
}
return lstLastFridays;
}