C# 如何计算下一年某一特定起始日期的最后一个星期六的日期

C# 如何计算下一年某一特定起始日期的最后一个星期六的日期,c#,asp.net,vb.net,C#,Asp.net,Vb.net,我想从给定的起始日期开始计算上周六的日期。 例如: 起始日期=#2013年9月28日# 然后我想从那一天开始,每年的最后一个星期六是: 2014年的星期六是:2014年9月27日 它将每年更新一次,下一次更新是: 2015年的星期六是:2015年9月26日 其次是: 2016年的星期六是:2016年9月24日 它像通常的日期一样运行,但开始日期不是1/1/[年],而是[星期六的日期]/9/年。。。 我将接受vb或c中的逻辑。。。 以下是我在vb.net中的代码: Dim DstartDate作为

我想从给定的起始日期开始计算上周六的日期。 例如:

起始日期=#2013年9月28日#

然后我想从那一天开始,每年的最后一个星期六是:

2014年的星期六是:2014年9月27日

它将每年更新一次,下一次更新是:

2015年的星期六是:2015年9月26日

其次是:

2016年的星期六是:2016年9月24日

它像通常的日期一样运行,但开始日期不是1/1/[年],而是[星期六的日期]/9/年。。。 我将接受vb或c中的逻辑。。。 以下是我在vb.net中的代码:

Dim DstartDate作为日期

数据开始日期=#2013年9月28日#

tnextyear=DstartDate.AddYears(1)
tyear=tnextyear.Year
tmonth=tnextyear.Month
tdate=tnextyear.Day
tday=tnextyear.DayOfWeek.ToString()
将日期变为日期
如果是(星期六)那么
ttdate=tnextyear.AddDays(-1)
tday=ttdate.DayOfWeek.ToString()
如果是星期六,那么
ttdate=tnextyear.AddDays(-2)
tday=ttdate.DayOfWeek.ToString()
如果结束
如果结束
tday=ttdate.DayOfWeek.ToString()
tyear+=1
lbltestYear.Text=tday&tyear
它不执行if条件。。。。标签显示“如果”之前的日期。。。在这段代码中,如果不是“星期六”,我会把日期减一,因为每年的日期都会减少一个到星期六,每4年减少2个。。。我还没有每4年设置一次条件,因为我只是想看看代码的输出是如何


先谢谢你。。。很抱歉之前,,,,

假设你需要知道未来10年的日期

Dim Startdate As DateTime = #9/28/2013# 

For i As Integer = 1 To 10
   Dim d As DateTime = Startdate.AddYears(i)
   Console.WriteLine(d.AddDays(-(d.DayOfWeek - DayOfWeek.Sunday) - 1))
Next
此代码适用于en US文化(从周日开始的一周)

附言

上述代码返回每年同一天的上周六。如果你需要得到一个月的最后一个星期六,那么使用

Dim Startdate As DateTime=#9/28/2013#
对于i,作为整数=1到10
Dim d As DateTime=新的日期时间(开始日期.年份+i,开始日期.月份+1,1).AddDays(-1)
星期六,星期五,星期六
d=d.AddDays(-1)
环
控制台写入线(d)
下一个
这里有一个C#解决方案

    public static void FindLastSaturday(int month, int startYear, int numberOfYears)
    {
        var dates = Enumerable.Range(startYear, numberOfYears)
            .Select(q => FilterFunc(new DateTime(q, month, CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(q, month))));
        foreach (DateTime lastSaturday in dates)
        {
            Console.WriteLine(lastSaturday.ToString("R"));
        }
    }
    private static DateTime FilterFunc(DateTime arg)
    {
        if (arg.DayOfWeek == DayOfWeek.Saturday)
        {
            return arg;
        }
        return FilterFunc(arg.AddDays(-1));
    }
它使用LINQ来预测一系列日期,并强制将它们设置为最后一个星期六。示例的输出如下所示

Sat, 27 Sep 2014 00:00:00 GMT
Sat, 26 Sep 2015 00:00:00 GMT
Sat, 24 Sep 2016 00:00:00 GMT
Sat, 30 Sep 2017 00:00:00 GMT
Sat, 29 Sep 2018 00:00:00 GMT

请注意,LINQ给出了2017年的正确答案,该月的最后一天是星期六。

“我将接受vb或c#中的解决方案”-我们也会接受。让我们看看你在这两方面的努力。哦。。。对不起,我忘记添加代码了。。。。我会编辑它…大多数日期库都会帮你处理。@shree.pat18对不起,我真的忘了把代码。。。我已经编辑过了。。。谢谢你提醒我…@rots很抱歉,,,我已经编辑过了…你检查过当I=4时会发生什么吗?“上周六不可能在9月23日到来。”加里·瓦索德说得对。我认为这个问题与给定的开始日期和月份有关。更新。你的新代码看起来好多了,你对它的来源有归属感吗?@smirnov谢谢你的帮助。。。我已经得到了解决方案。不幸的是,我在上面的帖子中使用的逻辑是错误的,这就是为什么我要改变它。我刚刚用+52表示下一年的星期六。非常感谢。亲爱的加里,谢谢你帮助我。问题已经解决。@user3567963,没问题,因为代码基本上是由斯米尔诺夫用来更正他的答案的,所以我将把这个添加到社区Wiki中。
    public static void FindLastSaturday(int month, int startYear, int numberOfYears)
    {
        var dates = Enumerable.Range(startYear, numberOfYears)
            .Select(q => FilterFunc(new DateTime(q, month, CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(q, month))));
        foreach (DateTime lastSaturday in dates)
        {
            Console.WriteLine(lastSaturday.ToString("R"));
        }
    }
    private static DateTime FilterFunc(DateTime arg)
    {
        if (arg.DayOfWeek == DayOfWeek.Saturday)
        {
            return arg;
        }
        return FilterFunc(arg.AddDays(-1));
    }
Sat, 27 Sep 2014 00:00:00 GMT
Sat, 26 Sep 2015 00:00:00 GMT
Sat, 24 Sep 2016 00:00:00 GMT
Sat, 30 Sep 2017 00:00:00 GMT
Sat, 29 Sep 2018 00:00:00 GMT