Создайте абсолютный или относительный класс периода времени в C # - PullRequest
0 голосов
/ 04 января 2012

Я хочу создать некоторый класс, который может рассчитывать абсолютный или относительный период времени.
Значение: конструктор получит либо период времени и единицы (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
    }
}

Но мне не нравится, что использование основано на состоянии.В конце данные появятся в пользовательском интерфейсе в виде двух разных элементов управления.Есть ли лучший способ сделать API немного лучше?Может быть, передать данные и вычислить dateTime на лету или что-то в этом роде?

ОБНОВЛЕНИЕ:

использование относится к любому времени его использования.Значение ввести интервал времени невозможно.Допустим, нам нужно относительное время, предшествующее 10 дням с этого момента или фиксированные дни от X до Y

TimeSpan будет рассчитано в другом классе BL (это класс POCO)

Ответы [ 3 ]

1 голос
/ 04 января 2012

Вы пытаетесь сохранить одни и те же данные дважды.

Вы можете определить любой период времени с помощью:

  • Начальная дата и конечная дата, продолжительность может быть рассчитана вычитанием.
  • Начальная дата и продолжительность (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)
1 голос
/ 04 января 2012

Я думаю, что у вас есть проблемы с пониманием вашей терминологии / домена.Периоды времени всегда являются относительными по определению.Абсолютный период времени будет фиксированной датой!

Можете ли вы вместо этого использовать структуру TimeSpan , которая является частью структуры?Затем вы можете каким-то образом «украсить» его, чтобы указать, откуда был рассчитан этот промежуток времени.

0 голосов
/ 04 января 2012

Прежде всего, я сомневаюсь, что использование какого-либо UnitsOfTime - очень хорошая идея.Попробуйте использовать TimeSpan вместо этого, и пользовательский интерфейс покажет недели или месяцы.Попробуйте что-то вроде этого:

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; }
    }
}

Также не могли бы вы объяснить причину, почему вам нужен этот класс?Это может помочь.

...