0

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

这有两个问题,

1) 当我很确定 C# 可以做到时,这似乎是对数据库的不必要查询。

2)我必须记得在年底添加在明年。

我浏览了网络,我确定某处有一个帖子清楚地向我展示了答案,但我似乎无法找到它!

我希望有人可以帮助我解决这个问题的代码。

提前谢谢了!

4

4 回答 4

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
于 2013-06-25T12:35:54.137 回答
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。

@Damien_The_Unbeliever 建议采用一种不那么粗暴的方法。它是这样的:

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 说他想包括当天,以防它也是星期五,也是今天之前的六个星期五。

于 2013-06-25T12:31:24.653 回答
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 日星期五

于 2013-06-26T02:17:00.043 回答
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;

 }
于 2013-06-25T12:42:13.780 回答