【问题标题】:Given the DayOfWeek number, find the date of a day in the previous week给定 DayOfWeek 数字,找到前一周的某一天的日期
【发布时间】:2014-04-28 15:30:18
【问题描述】:

这可能简单得令人尴尬,但我有一个“不会做基本数学”的日子。

我有一个系统,我们会根据当天的订单来切断订单,例如,周五下午 4 点之后您不能为下周日订购,或者周二下午 2 点之后您不能为第二天订购。知道我需要在 5 月 4 日星期日说好我需要一个产品,截止日期是什么时候,让它告诉我现在是 5 月 2 日星期五。

所以我有以下无法正常工作的代码

int offset = (int)reqDate.DayOfWeek - thiscafeday.day_number;

DateTime cutoffDateTime = reqDate.AddDays(-offset);

其中 reqDate.DayOfWeek 是星期日 (0),thiscafeday.day_number 是星期五 (5)。我需要星期五的约会。如果截止日期是第二天,那么 cutoffDateTime 值是正确的,但星期日(即 DayOfWeek 0)似乎把一切都搞砸了。我似乎经常得到正确的一天,但 下一个 周,而不是前一周(我猜我们是由于负偏移量)。

如果有人有一种简单的方法可以在给定当前日期的情况下获取过去一周内任意一天的日期,我将非常感谢您的帮助。

我也尝试过

((7- (int)reqDate.DayOfWeek + thiscafeday.day_number) % 7)

但也无法让它工作。

任何帮助表示赞赏。

【问题讨论】:

    标签: c# datetime


    【解决方案1】:

    您可以使用这些扩展方法:

    public static class DateExtensions
    {
        public static DateTime Next(this DateTime from, DayOfWeek dayOfWeek)
        {
            int start = (int)from.DayOfWeek;
            int wanted = (int)dayOfWeek;
            if (wanted <= start)
                wanted += 7;
            return from.AddDays(wanted - start);
        }
    
        public static DateTime Previous(this DateTime from, DayOfWeek dayOfWeek)
        {
            int end = (int)from.DayOfWeek;
            int wanted = (int)dayOfWeek;
            if (wanted >= end)
                end += 7;
            return from.AddDays(wanted - end);
        }
    }
    
    
    var lastFriday = DateTime.Today.Previous(DayOfWeek.Friday);
    

    (可能需要针对您的特定场景进行一些调整)

    【讨论】:

      【解决方案2】:

      您可以简单地向后退一步,直到到达您想要的位置,而不是尝试计算要抵消的天数。

      DateTime GetDay(DateTime startDate, DayOfWeek targetDay)
      {
          var date = startDate;
          while (date.DayOfWeek != targetDay)
          {
              date = date.AddDays(-1);
          }
          return date;
      }
      

      如果您还需要偏移量,您可以减去之后的日期:

      DateTime startDate = new DateTime(2014, 4, 27); // Sunday
      DateTime friday = GetDay(startDate, DayOfWeek.Friday);
      int diff = (startDate - friday).Days; // subtracting DateTimes gives a TimeSpan
      Console.WriteLine(diff); // 2
      

      【讨论】:

      • 感谢蒂姆的帮助,我看过循环,虽然必须有一种“聪明而优雅”的方式使用数字,但这次显然不是!
      • 你当然可以只用数字来做到这一点。它最终是否比循环更优雅、更清晰还不确定。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 2010-09-22
      • 1970-01-01
      • 2019-06-26
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多