【问题标题】:How do you do end-of-week rounding on a date field in C# (without using LINQ)?如何在 C# 中对日期字段进行周末舍入(不使用 LINQ)?
【发布时间】:2008-10-27 16:35:10
【问题描述】:

我有一个奇怪的日期舍入问题,希望有人能解决。我的客户使用从周一到周日的工作周。星期天的日期被认为是一周的结束,并用于标识在特定星期输入的所有记录(因此上周输入的任何内容的 WEEKDATE 值为 '10/26/2008',即星期日的日期)。

一个小转折是用户输入前一周的记录,直到当周星期一上午 11 点。

所以我需要一个以 DateTime.Now 开头并根据上述规则返回周末日期(无时间部分)的函数。谢谢你的帮助。我有一个可行的解决方案,但我不好意思发布它。

哦,我不能使用 LINQ。

【问题讨论】:

    标签: c# .net datetime


    【解决方案1】:
    public DateTime WeekNum(DateTime now)
    {
        DateTime NewNow = now.AddHours(-11).AddDays(6);
    
        return (NewNow.AddDays(- (int) NewNow.DayOfWeek).Date);
    }
    
    public void Code(params string[] args)
    {
    
        Console.WriteLine(WeekNum(DateTime.Now));   
        Console.WriteLine(WeekNum(new DateTime(2008,10,27, 10, 00, 00)));
        Console.WriteLine(WeekNum(new DateTime(2008,10,27, 12, 00, 00)));
        Console.WriteLine(WeekNum(new DateTime(2008,10,28)));
        Console.WriteLine(WeekNum(new DateTime(2008,10,25)));
    
    
    }
    

    您可以硬编码 DateTime.Now 而不是传递 DateTime 对象。这种方式只是让测试变得更容易。

    【讨论】:

    • DayOfWeek 是星期日 = 0,星期一 = 1 等等?
    • @Joel:抱歉,发布得太快了。修订版应该可以工作。
    • 谢谢,詹姆斯。我将 .Date 添加到返回行,所以我只得到日期部分。
    【解决方案2】:

    这也适用于我:

    [Test]
    public void Test()
    {
       DateTime sunday = DateTime.Parse("10/26/2008");
       DateTime nextSunday = DateTime.Parse("11/2/2008");
    
       Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/21/2008")));
       Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/22/2008")));
       Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/23/2008")));
       Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/24/2008")));
       Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/25/2008")));
       Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/26/2008")));
       Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/27/2008 10:59 AM")));
       Assert.AreEqual(nextSunday, GetSunday(DateTime.Parse("10/27/2008 11:00 AM")));
    }
    
    private DateTime GetSunday(DateTime date)
    {
       if (date.DayOfWeek == DayOfWeek.Monday && date.Hour < 11)
          return date.Date.AddDays(-1);
    
       while (date.DayOfWeek != DayOfWeek.Sunday)
          date = date.AddDays(1);
    
       return date.Date;
    }
    

    【讨论】:

      【解决方案3】:
      DateTime GetMidnightFollowingSunday()
      {
          DateTime now = DateTime.Now;
          return now.AddDays(7 - (int)now.DayOfWeek).Date;
      }
      

      如果您需要在星期一早上 11 点之后开始新的一周,只需从现在减去 11 小时,但将方法命名为其他名称可能是有意义的。

      DateTime GetRecordDate()
      {
          DateTime nowMinusOffset = DateTime.Now.AddHours(-11);
          return nowMinusOffset.AddDays(7-(int)nowMinusOffset.DayOfWeek).Date;
      }
      

      【讨论】:

      • 关闭,但您正在将当前的星期日变成下一个星期日。
      【解决方案4】:

      我已经成功使用了这些扩展:

      http://www.codeplex.com/DateTimeExtensions

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多