【问题标题】:Get date of first Monday of the week? [duplicate]获取一周的第一个星期一的日期? [复制]
【发布时间】:2010-12-12 13:22:31
【问题描述】:

我想知道你们是否知道如何根据今天的日期获取当前星期的星期一的日期?

即 2009-11-03 传入,2009-11-02 返回

/M

【问题讨论】:

标签: c# .net


【解决方案1】:
public static class DateTimeExtension
{
    public static DateTime GetFirstDayOfWeek(this DateTime date)
    {
        var firstDayOfWeek = CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek;

        while (date.DayOfWeek != firstDayOfWeek)
        {
            date = date.AddDays(-1);
        }

        return date;
    }
}

这里是国际。我认为作为扩展它会更有用。

【讨论】:

    【解决方案2】:

    怎么样:

    CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek
    

    为什么不使用原生解决方案?

    【讨论】:

    • 问题是获取具体日期(即2015-11-20)而不是哪一天被定义为第一天。
    【解决方案3】:
    var now = System.DateTime.Now;
    
    var result = now.AddDays(-((now.DayOfWeek - System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek + 7) % 7)).Date;
    

    可能会在星期一返回您。除非您使用的文化中星期一不是一周的第一天。

    【讨论】:

      【解决方案4】:

      Pondium 答案在某些情况下可以向前搜索。如果您只想向后搜索,我认为应该是:

      DateTime input = //...
      int delta = DayOfWeek.Monday - input.DayOfWeek;
      if(delta > 0)
          delta -= 7;
      DateTime monday = input.AddDays(delta);
      

      【讨论】:

      • 这应该是处理星期日的正确答案,即 FirstDayOfWeek 是星期一,所以如果星期日是输入日期,它应该返回前一个星期一。接受的答案没有。
      • +1 如果“输入”是 2017 年 1 月 1 日(星期日),则此代码将 26/12/2016 作为一周的第一天!不是 2017 年 2 月 1 日(这是公认的答案!)
      • 它也适用于 01/01/2019 = 31/12/2018!
      • var monday = DateTime.Now.AddDays(DayOfWeek.Monday - DateTime.Now.DayOfWeek > 0 ? (DayOfWeek.Monday - DateTime.Now.DayOfWeek) - 7 : DayOfWeek.Monday - DateTime.Now .DayOfWeek).日期;
      • 这对我有用。也在周日或周一。这只是工作!谢谢
      【解决方案5】:

      试试这个:

      public DateTime FirstDayOfWeek(DateTime date)
      {
          var candidateDate=date;
          while(candidateDate.DayOfWeek!=DayOfWeek.Monday) {
              candidateDate=candidateDate.AddDays(-1);
          }
          return candidateDate;
      }
      

      编辑以确保完整性:今天的日期超载:

      public DateTime FirstDayOfCurrentWeek()
      {
          return FirstDayOfWeek(DateTime.Today);
      }
      

      【讨论】:

      • 为什么要循环??有很多方法可以不用循环。请参阅下面的答案。
      【解决方案6】:

      这是我使用的(可能没有国际化):

      DateTime input = //...
      int delta = DayOfWeek.Monday - input.DayOfWeek;
      DateTime monday = input.AddDays(delta);
      

      【讨论】:

      • 是的,确实:没有国际化。星期一并不总是一周的第一天。
      • 您可以使用以下方法获取一周的第一天:CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek
      • 实际上,根据文化,一周的第一天在这种情况下是没有意义的; OP 想要一周的星期一,而不是一周的第一天。
      • -1。给定一个星期天,它会在第二天返回,而不是 6 天前。 (DayOfWeek.Monday1input.DayOfWeek0 代表星期日。)
      • 道歉,不要把它当成个人,我只是想对谷歌“一周的第一天”并得到这个的人表达不同意见。 (有趣的是,您将星期日作为英国的 fdow,就像在 en-GB 文化中一样,它是星期一。)
      【解决方案7】:

      这样的事情会起作用

      DateTime dt = DateTime.Now;
      while(dt.DayOfWeek != DayOfWeek.Monday) dt = dt.AddDays(-1); 
      

      我相信还有更好的方法 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多