Представление времени (не дата и время) в C # - PullRequest
4 голосов
/ 25 августа 2010

Я разрабатываю приложение, которое требует понятия времени открытия (Немного похоже на магазин)

Как лучше всего это представить? Они будут сохранены в БД позже ...

Пока у меня есть следующий класс:

public class OpeningTime
{
    public DayOfWeek DayOfWeek { get; set; }
    public DateTime OpeningTime { get; set; }
    public DateTime ClosingTime { get; set; }
}

Так что мой вымышленный класс "магазин" будет примерно таким:

public class Shop
{
    public string Name { get; set; }
    public string Address { get; set; }
    public List<OpeningTime> OpeningTimes { get; set; }
}

Является ли DateTime правильным для представления чего-то вроде:

Понедельник - 9:00 - 17:30

Ответы [ 4 ]

4 голосов
/ 25 августа 2010

Придерживайтесь DateTime

Я бы просто использовал DateTime, так как он хорошо сопоставляется с SQL (SQL также использует DateTime), и я считаю, что он более читабелен, чем TimeSpan.Вы также можете использовать тот же объект и добавить к нему дату, чтобы получить, например, сегодняшнее время открытия.

Почему бы не TimeSpan?

Из-за его имени и того, чтоэто подразумевает.TimeSpan представляет период времени, а не момент времени.Хотя он используется в рамках для представления точного времени (в TimeOfDay), но это свойство определяется в документах как:

TimeSpan, который представляетдоля дня, прошедшего с полуночи.

Но ... не имеет большого значения

В конце концов, это мало что меняет,Вы можете использовать TimeSpan, DateTime или свою собственную структуру.С одной стороны, есть небольшие накладные расходы, все сводится к тому, что вы находите более читабельным и простым в обслуживании.

3 голосов
/ 25 августа 2010

Лично я бы использовал TimeSpan, а не DateTime, но я слышал, что другие высказывают противоположное мнение.

[Serializable()]
public class OpeningTime
{
    protected OpeningTime()
    {
    }

    public OpeningTime(DayOfWeek dayOfWeek, TimeSpan fromTime, TimeSpan toTime) 
        : this(dayOfWeek, fromTime.Hours, fromTime.Minutes, toTime.Hours, toTime.Minutes) { }

    public OpeningTime(DayOfWeek dayOfWeek, int fromHours, int fromMinutes, int toHours, int toMinutes)
    {
        if (fromHours < 0 || fromHours > 23)
        {
            throw new ArgumentOutOfRangeException("fromHours", "fromHours must be in the range 0 to 23 inclusive");
        }

        if (toHours < 0 || toHours > 23)
        {
            throw new ArgumentOutOfRangeException("toHours", "toHours must be in the range 0 to 23 inclusive");
        }

        if (fromMinutes < 0 || fromMinutes > 59)
        {
            throw new ArgumentOutOfRangeException("fromMinutes", "fromMinutes must be in the range 0 to 59 inclusive");
        }

        if (toMinutes < 0 || toMinutes > 59)
        {
            throw new ArgumentOutOfRangeException("toMinutes", "toMinutes must be in the range 0 to 59 inclusive");
        }

        this.FromTime = new TimeSpan(fromHours, fromMinutes, 0);
        this.ToTime = new TimeSpan(toHours, toMinutes, 0);

        if (this.FromTime >= this.ToTime)
        {
            throw new ArgumentException("From Time must be before To Time");
        }

        this.DayOfWeek = dayOfWeek;
    }

    public virtual DayOfWeek DayOfWeek { get; private set; }

    public virtual TimeSpan FromTime { get; private set; }

    public virtual TimeSpan ToTime { get; private set; }
}
2 голосов
/ 25 августа 2010

Я думаю, вы могли бы внутренне представить это как DateTime для начала (который дает вам DayOfWeek), а затем TimeSpan для конца, но выставить их как три свойства, которые либо DateTimes, либо TimeSpans

Now toвключить более DDD шляпу ... Вы можете "использовать" объект TimeSpan для представления времени суток, но если бы я думал о терминах DDD, я бы хотел подумать о том, какое время открывает магазин.TimeSpans может представлять гораздо больше информации, и вы должны специально проверять каждый раз, когда вы имеете дело с ними, что они не более одного дня.

Таким образом, один из способов - создать простой класс, представляющий то, что вы пытаетесь представить (вы можете просто обернуть объект TimeSpan вместо использования нескольких целых).

public struct Time 
{
    private readonly int _hour;
    private readonly int _minute;
    private readonly int _second;

    public Time(int hour, int minute, int second)
    {
        if (hour < 0 || hour >= 24)
            throw new ArgumentOutOfRangeException("hour", "Hours must be between 0 and 23 inclusive");
        if (minute < 0 || minute > 59)
            throw new ArgumentOutOfRangeException("minute", "Minutes must be between 0 and 23 inclusive");
        if (second < 0 || second > 59)
            throw new ArgumentOutOfRangeException("second", "Seconds must be between 0 and 23 inclusive");
        _hour = hour;
        _minute = minute;
        _second = second;
    }

    public Time(Time time)
        : this(time.Hour, time.Minute, time.Second)
    {

    }

    public int Hour { get { return _hour; } }
    public int Minute { get { return _minute; } }
    public int Second { get { return _second; } }

    public override string ToString()
    {
        return ToString(true);
    }

    public string ToString(bool showSeconds)
    {
        if (showSeconds)
            return string.Format("{0:00}:{1:00}:{2:00}", Hour, Minute, Second);
        return string.Format("{0:00}:{1:00}:{2:00}", Hour, Minute);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (obj.GetType() != typeof (Time)) return false;
        return Equals((Time) obj);
    }

    public bool Equals(Time other)
    {
        return other._hour == _hour && other._minute == _minute && other._second == _second;
    }

    public override int GetHashCode()
    {
        unchecked
        {
            int result = _hour;
            result = (result*397) ^ _minute;
            result = (result*397) ^ _second;
            return result;
        }
    }

}

public class OpeningHours
{
    public DayOfWeek DayOfWeek { get; set; }
    public Time OpeningTime { get; set; }
    public Time ClosingTime { get; set; }
    public OpeningHours(DayOfWeek dayOfWeek, Time openingTime, Time closingTime)
    {
        DayOfWeek = dayOfWeek;
        OpeningTime = openingTime;
        ClosingTime = closingTime;
    }
}
2 голосов
/ 25 августа 2010

Вы можете использовать TimeSpan для представления времени суток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...