如何获取给定开始日期的每个下一年的最后一个星期六的日期

时间:2014-05-02 03:14:01

标签: c# asp.net vb.net

我想从给定的开始日期开始上一个星期六的日期。 例如:

  
    

Startdate =#9/28/2013#

  

那么我想从那个开始日起每隔一个星期六进行一次,那将是:

  
    

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

  

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

  
    

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

  

然后又是:

  

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

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

  
    

Dim DstartDate As Date

  
     

DstartDate =#9/28/2013#

tnextyear = DstartDate.AddYears(1)
    tyear = tnextyear.Year
    tmonth = tnextyear.Month
    tdate = tnextyear.Day
    tday = tnextyear.DayOfWeek.ToString()
    Dim ttdate As Date
     If (tday <> "Saturday") Then
        ttdate = tnextyear.AddDays(-1)
        tday = ttdate.DayOfWeek.ToString()
        If tday <> "Saturday" Then
            ttdate = tnextyear.AddDays(-2)
            tday = ttdate.DayOfWeek.ToString()
        End If       
    End If
    tday = ttdate.DayOfWeek.ToString()
    tyear += 1
    lbltestYear.Text = tday & tyear

它没有执行if condidition ....标签显示之前的tday&#34;如果&#34; ...在该代码中我把条件减去日期,如果它不是& #34;星期六&#34 ;,因为每年的日期将减少一个星期六,每4年减少2 ...我没有按照每4年的条件,因为我只是看看如何该代码的输出......

提前致谢...并且抱歉之前,,,,

2 个答案:

答案 0 :(得分:0)

假设你需要获得未来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文化(周从星期日开始)

P.S。

上述代码会在每年的同一天返回上周六。如果您需要获取本月的最后一个星期六,请使用

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

For i As Integer = 1 To 10
   Dim d As DateTime = New DateTime(Startdate.Year + i, Startdate.Month + 1, 1).AddDays(-1)
   Do While d.DayOfWeek <> DayOfWeek.Saturday
       d = d.AddDays(-1)
   Loop
   Console.WriteLine(d)
Next

答案 1 :(得分:0)

这是一个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年的正确答案,其中星期六属于该月的最后一天。