【问题标题】:How to calculate 2nd Friday of Month in C# [duplicate]如何在C#中计算每月的第二个星期五[重复]
【发布时间】:2011-09-02 15:48:20
【问题描述】:

可能重复:
How to find the 3rd Friday in a month with C#?

大家好,

我编写了一个小控制台实用程序,它可以将一行输出到一个文本文件中。我希望这条线包括本月的第二个星期五。有没有办法做到这一点?

谢谢大家!

【问题讨论】:

  • 我链接的问题基本上是相同的问题。只需将 yourDate 替换为 DateTime.Now 并将 15 替换为 8。
  • 我看过了。它真的那么健壮吗?
  • 如果我的问题是骗人的,我该怎么办?
  • 由于还没有投票,如果看到请点击[删除]。

标签: c# date console-application


【解决方案1】:

@druttka 的细微变化:使用扩展方法。

 public static DateTime NthOf(this DateTime CurDate, int Occurrence , DayOfWeek Day)
 {
     var fday = new DateTime(CurDate.Year, CurDate.Month, 1);

     var fOc = fday.DayOfWeek == Day ? fday : fday.AddDays(Day - fday.DayOfWeek);
     // CurDate = 2011.10.1 Occurance = 1, Day = Friday >> 2011.09.30 FIX. 
     if (fOc.Month < CurDate.Month) Occurrence = Occurrence+1;
     return fOc.AddDays(7 * (Occurrence - 1));
 }

然后这样称呼它:

 for (int i = 1; i < 13; i++)
 {
      Console.WriteLine(new DateTime(2011, i,1).NthOf(2, DayOfWeek.Friday));
 }

【讨论】:

  • +1 但 IMO fOc 是错误的变量名。我不得不思考fOc到底代表什么?我明白了,但它浪费了几秒钟。由于我们阅读代码的次数多于编写代码的次数,因此我认为最好将其拼写出来。
  • 可能的错误:当 fOc 跨越年份边界(即从 1 月到 12 月)时,看起来 (fOc.Month
  • @User fOc 到底代表什么?
  • @PandaWood 我相信它代表“第一次出现”(期望的星期几)。
  • @User 我将它插入到一些单元测试中,并且在跨越年份边界时看到了一个错误。我将|| fOc.Year &lt; CurDate.Year 的等效项添加到if 中,到目前为止,这已经解决了我失败的单元测试。
【解决方案2】:

我会选择这样的。

    public static DateTime SecondFriday(DateTime currentMonth)
    {
        var day = new DateTime(currentMonth.Year, currentMonth.Month, 1);
        day = FindNext(DayOfWeek.Friday, day);
        day = FindNext(DayOfWeek.Friday, day.AddDays(1));
        return day;
    }

    private static DateTime FindNext(DayOfWeek dayOfWeek, DateTime after)
    {
        DateTime day = after;
        while (day.DayOfWeek != dayOfWeek) day = day.AddDays(1);
        return day;
    }

【讨论】:

    【解决方案3】:

    未经测试,但这应该抓住它。

    DateTime today = DateTime.Today;
    DateTime secondFriday = 
         Enumerable.Range(8, 7)
                   .Select(item => new DateTime(today.Year, today.Month, item))
                   .Where(date => date.DayOfWeek == DayOfWeek.Friday)
                   .Single();
    

    【讨论】:

      【解决方案4】:

      完全测试:

      for (int mo = 1; mo <= 12; mo++)
      {
          DateTime _date = new DateTime(yr, mo, 1);
          DayOfWeek day = _date.DayOfWeek;
      
          int d = 0;
          if (day == DayOfWeek.Saturday)
              d += 7;
      
          var diff = DayOfWeek.Friday - day;
      
          DateTime secFriday = _date.AddDays(diff + 7 + d);
          Console.WriteLine(secFriday.ToString("MM\tddd\tdd"));
      }  
      

      最终结果:

      Month           Date
      =====================
      01      Fri     14
      02      Fri     11
      03      Fri     11
      04      Fri     08
      05      Fri     13
      06      Fri     10
      07      Fri     08
      08      Fri     12
      09      Fri     09
      10      Fri     14
      11      Fri     11
      12      Fri     09
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-09
        • 1970-01-01
        • 2018-05-26
        • 2014-05-10
        • 1970-01-01
        • 2021-12-04
        相关资源
        最近更新 更多