【问题标题】:How to take the date of the last saturday for every next year of a given startdate如何获取给定开始日期的每个明年的最后一个星期六的日期
【发布时间】:2014-05-02 03:14:01
【问题描述】:

我想从给定的 startdate 中获取最后一个星期六的日期。 例如:

开始日期 = #9/28/2013#

那么我想从该开始日期开始每年的最后一个星期六,它将是:

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

每年都会更新,下一个又是:

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

接下来又是:

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

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

将 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 条件....标签显示“如果”之前的 tday...在该代码中,如果不是“星期六”,我将条件减去日期,因为每年日期将减少一个到星期六,每 4 年减少 2...我还没有设置每 4 年的条件,因为我只是想看看该代码的输出如何...

在此先感谢...之前很抱歉,,,,

【问题讨论】:

  • “我将接受 vb 或 c# 中的解决方案” - 我们也将接受。向我们展示你的努力。
  • 哎呀...抱歉我忘记添加我的代码...我会编辑它...
  • 大多数日期库应该为你处理这个问题。
  • @shree.pat18 对不起,我真的忘记放代码了...我已经编辑过了...谢谢提醒...
  • @rots 很抱歉,,,我已经编辑过了...

标签: c# asp.net vb.net


【解决方案1】:

假设您需要获取未来 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# 

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

【讨论】:

  • 你检查过 i = 4 时会发生什么吗?最后一个星期六不可能落在 9 月 23 日。
  • @Garry Vassood 好点。我认为这个问题与给定的开始日期和月份有关。已更新。
  • 你的新代码看起来好多了,你知道它的来源吗?
  • @smirnov 感谢您帮助我...我已经找到了解决方案。不幸的是,我在上面的帖子中使用的逻辑是错误的,这就是我改变它的原因。我刚刚用 +52 一周来获得明年的星期六。非常感谢。
【解决方案2】:

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

【讨论】:

  • 亲爱的加里,感谢您帮助我。问题已经解决了。
  • @user3567963,没有问题,因为代码本质上是 smirnov 用来纠正他的答案的,所以我会将这个添加到社区 Wiki。
猜你喜欢
  • 2018-06-12
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 2017-07-19
  • 1970-01-01
相关资源
最近更新 更多