【问题标题】:Create an absolute or relative time period class in C#在 C# 中创建绝对或相对时间段类
【发布时间】:2012-01-04 09:03:31
【问题描述】:

我想创建一些可以计算绝对或相对时间段的类。
含义:构造函数将获得时间段和单位(3 周)或两个DateTime 开始和结束时间。我写了以下代码:

public class TimePeriod
{

    public State TimePerriodState { get; private set; }
    public RelativeTime RelativeTimePeriod { get; private set; }
    public int UnitsOfTime { get; private set; }

    public DateTime? StartTime { get; private set; }
    public DateTime? EndTime { get; private set; }

    public TimePeriod(RelativeTime relativeTime, int unitsOfTime)
    {
        TimePerriodState = State.Absolute;
        RelativeTimePeriod = relativeTime;
        UnitsOfTime = unitsOfTime;
    }

    public TimePeriod(DateTime startTime , DateTime endTime)
    {
        TimePerriodState = State.Relative;
        StartTime = startTime;
        EndTime = endTime;
    }


    public enum State
    {
        None,
        Absolute,
        Relative
    }

    public enum RelativeTime
    {
        None,
        Hours,
        Days,
        Weeks,
        Months,
        Year
    }
}

但我不喜欢基于状态的用法。 最后,数据将作为两个不同的控件出现在 UI 中。有没有更好的方法让 API 变得更好?也许传入数据并即时计算 dateTime 或类似的东西?

更新:

使用是相对于它被使用的任何时间。意味着无法输入时间跨度。假设我们需要从现在开始的 10 天之前的相对时间或从 X 到 Y 的固定天数

TimeSpan 将在不同的 BL 类中计算(这是一个 POCO 类)

【问题讨论】:

    标签: c# datetime timespan


    【解决方案1】:

    您基本上是在尝试将相同的数据存储两次。

    您可以通过以下任一方式定义任何时间段:

    • 可以通过减法计算开始日期和结束日期,持续时间。
    • 有开始日期和持续时间(TimeSpan),结束日期可以通过两者相加计算得出。
    • 您可以使用持续时间和结束日期来执行此操作,但这会使事情变得更加困难。

    您要做的是选择一种存储方式。如果你想要它的另一种方式,写一个函数来计算它。例如:

    public TimePeriod(DateTime startTime , DateTime endTime)
    {
        StartTime = startTime;
        EndTime = endTime;
    }
    
    public TimePeriod(DateTime startTime , TimeSpan length)
    {
        StartTime = startTime;
        EndTime = startTime + length;
    }
    
    public TimeSpan GetDuration()
    {
        return EndTime - StartTime;
    }
    
    //Else you can just get the StartTime or EndTime variable (DateTime)
    

    【讨论】:

      【解决方案2】:

      我认为您对术语/领域的理解有问题。根据定义,时间段始终是相对的。绝对时间段将是一个固定日期!

      您可以改用作为框架一部分的TimeSpan 结构吗?然后,您可以以某种方式对其进行“装饰”,以指明该时间跨度的计算来源。

      【讨论】:

        【解决方案3】:

        首先,我怀疑使用某种 UnitsOfTime 是一个非常好的主意。尝试改用 TimeSpan,UI 将显示几周或几个月。试试这样的:

        public class TimePeriod
        {
            private readonly DateTime? _startDate;
            private readonly DateTime? _endDate;
            private readonly TimeSpan _timeSpan;
        
            public TimePeriod(DateTime startDate, DateTime endDate)
            {
                if (_startDate > _endDate)
                {
                    throw new ArgumentException();
                }
                _startDate = startDate;
                _endDate = endDate;
                _timeSpan = endDate - startDate;
            }
        
            public TimePeriod(TimeSpan timeSpan)
            {
                _timeSpan = timeSpan;
            }
        
            public TimeSpan TimeSpan
            {
                get { return _timeSpan; }
            }
        
            public DateTime? StartDate
            {
                get { return _startDate; }
            }
        
            public DateTime? EndDate
            {
                get { return _endDate; }
            }
        
            public bool IsAbsolute
            {
                get { return _startDate.HasValue; }
            }
        }
        

        你能解释一下为什么你需要这个类吗?它可能会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-01-05
          • 2018-05-25
          • 1970-01-01
          • 2011-01-15
          • 1970-01-01
          • 2022-06-19
          • 1970-01-01
          相关资源
          最近更新 更多