C# 从今天起的最后6个星期五

C# 从今天起的最后6个星期五,c#,.net,datetime,C#,.net,Datetime,这是一个非常具体的一个,我需要在C.NET的最后6个星期五的日期。目前,我们正在通过一个SQL数据库完成这项任务,该数据库包含一年中星期五的全部日期 这有两个问题, 1当我非常确定C可以做的时候,它似乎是对数据库的一个不必要的查询 2我必须记得在年底时加入下一年 我已经在网上浏览了一下,我肯定在某个地方有一个帖子在清晰地告诉我答案,但我似乎找不到它 我希望有人能帮我解决这个问题 非常感谢 DateTime结构有一个名为的属性。它是一个枚举,告诉您与DateTime实例对应的星期几 因此,您可以编

这是一个非常具体的一个,我需要在C.NET的最后6个星期五的日期。目前,我们正在通过一个SQL数据库完成这项任务,该数据库包含一年中星期五的全部日期

这有两个问题,

1当我非常确定C可以做的时候,它似乎是对数据库的一个不必要的查询

2我必须记得在年底时加入下一年

我已经在网上浏览了一下,我肯定在某个地方有一个帖子在清晰地告诉我答案,但我似乎找不到它

我希望有人能帮我解决这个问题

非常感谢

DateTime结构有一个名为的属性。它是一个枚举,告诉您与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);
}
var last6Fridays = DayOfWeek.Friday.Last(6);
这样你就可以在今天之前的六个星期五上班了。如果你想在今天之后的六个星期五,只需在循环中添加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说他想包括当天,以防也是周五,也就是今天之前的六个周五。

主要思想是在今天之前选择第一个周五,每次一周:

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
你也可以试试这个

 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;

 }

这里有一个可以使用的扩展方法

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 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日,星期五


日历课做得很好:也许我只是误解了你,但是你需要今天之前的6个星期五或者今天之后的6个星期五?还有,如果现在是星期五,我们是否忽略了今天?这是今天之前的6个星期五,如果今天是星期五,那么这将是6个星期五之一。你不认为,在你确定了第一个星期五之后,可能会有一个机会,从中立即计算出所有其他星期五,而不是循环吗?@Damien_the_unsiver yep。甚至还有这样一个答案,我投了更高的票。只是这是一个20秒的解决方案。人们总是可以改进的。如果这是一个更复杂的问题,我肯定不会使用我建议的暴力解决方案。忽略其他细节,我想建议使用TimeSpan.FromDays7而不是新的TimeSpan7,0,0,0,0-这使代码更具可读性。您还可以使用DateTime.AddDays。我认为这更直观。如果今天是星期五或星期六,这不会有好结果。几乎,但不完全是这样。。。检查一下你应该减去一周的时间的逻辑。如果需要提示,请比较我的答案-@马特约翰逊:为什么?现在是星期五,我们只需要减法。如果是-我们需要从今天开始,数到六周如果今天是星期六,你将减去一周,跳过昨天,这应该在列表中。