【问题标题】:Declaring a range of dates with datetime用 datetime 声明一个日期范围
【发布时间】:2017-06-22 13:30:22
【问题描述】:

我想知道设置日期范围的最佳方式。我有逻辑可以检查某条记录在哪一天获得批准,并根据那一天设置下一次需要重新批准该记录的日期

因此,如果记录在 1 月或 2 月获得批准,则应在 3 月重新评估,如果在 3 月获得批准,则应在 6 月重新评估。

我现在这样声明我的范围,但我认为这不是最好的方法

        DateTime quarterOneStart = new DateTime(DateTime.Now.Year,07,01);
        DateTime quarterOneEnd = new DateTime(DateTime.Now.Year, 09, 15));
        DateTime quarterTwoStart = new DateTime(DateTime.Now.Year, 10, 01);
        DateTime quarterTwoEnd = new DateTime(DateTime.Now.Year, 12, 15));
        DateTime quarterThreeStart = new DateTime(DateTime.Now.Year, 01, 01);
        DateTime quarterThreeEnd = new DateTime(DateTime.Now.Year, 03, 15));
        DateTime quarterFourStart = new DateTime(DateTime.Now.Year, 04, 01);
        DateTime quarterFourEnd = new DateTime(DateTime.Now.Year, 06, 15));

有没有更好的方法来设置上面的日期时间变量?

【问题讨论】:

  • 如果第一季度在 9 月中旬结束,第二季度在 10 月初开始,那么 9 月下旬发生的记录会怎样?
  • 这些记录必须在 12 月重新评估
  • 那么不应该在九月底结束四分之一吗?抱歉,如果这是一个愚蠢的问题。

标签: c# datetime logic date-range


【解决方案1】:

那一学期的课呢

public class Quarter {

    private readonly DateTime _startDate;
    private readonly DateTime _endDate;

    public Quarter(DateTime startDate, DateTime endDate) {
        _startDate = startDate;
        _endDate = endDate;
    }

    public DateTime StartDate => _startDate;
    public DateTime EndDate => _endDate;
}

并使用它

Quarter one = new Quarter(new DateTime(2017, 07, 01), new DateTime(2017, 09, 15));
Quarter two = new Quarter(new DateTime(2017, 09, 15), new DateTime(2017, 10, 01));
...

【讨论】:

    【解决方案2】:

    您可以创建由enum 键入的项目的Dictionary,而不是创建多个变量。例如:

    public enum Quaters
    {
        Q1_Start,
        Q1_End,
        Q2_Start,
        Q2_End,
        Q3_Start,
        Q3_End,
        Q4_Start,
        Q4_End
    }
    
    Dictionary<Quaters, DateTime> dateRange = new Dictionary<Quaters, DateTime>
    {
        {Quaters.Q1_Start, new DateTime(DateTime.Now.Year, 07, 01)},
        {Quaters.Q1_End, new DateTime(DateTime.Now.Year, 09, 15)},
        {Quaters.Q2_Start, new DateTime(DateTime.Now.Year, 10, 01)},
        {Quaters.Q2_End, new DateTime(DateTime.Now.Year, 12, 15)},
        ...
    };
    

    当您需要根据任何范围参数验证值时,您可以根据键索引 dateRange 字典。这只是一个建议,对于您的实际问题可能会有更好的解决方案。

    【讨论】:

      【解决方案3】:

      在过去,我编写了一个 FinancialYear 类,该类内部包含一个 startYear (int) 变量并提供各种方法/属性,例如(除其他外)

      public DateTime StartDate
      {
          get { return new DateTime(_startYear, 4, 1); } // April 1st
      }
      
      public static FinancialYear ForDate(DateTime dt)
      {
          DateTime finYearStart = new DateTime(dt.Year, 4, 1);
          return (dt >= finYearStart) ? new FinancialYear(dt.Year) : new FinancialYear(dt.Year - 1);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多