Подтвердить что ты не робот

Как представить значение времени только в .NET?

Есть ли способ представить значение времени только в .NET без даты? Например, указывая время открытия магазина?

TimeSpan указывает диапазон, тогда как я хочу только сохранить значение времени. Использование DateTime для указания этого приведет к появлению нового DateTime(1,1,1,8,30,0), который не является действительно желательным.

4b9b3361

Ответ 1

Как говорили другие, вы можете использовать DateTime и игнорировать дату или использовать TimeSpan. Лично я не увлекаюсь ни одним из этих решений, так как ни один из типов не отражает концепцию, которую вы пытаетесь представить, - я рассматриваю типы даты/времени в .NET как-то на разреженной стороне, что является одной из причин, по которым я начал Noda Time. В Noda Time вы можете использовать тип LocalTime для представления времени суток.

Одна вещь, которую следует учитывать: время суток не обязательно длится с полуночи в тот же день...

(В другом случае, если вы также хотите представить время закрытия магазина, вы можете обнаружить, что хотите представить 24:00, то есть время в конце дня. Большинство API-интерфейсов даты и времени - включая Noda Time - не допускайте, чтобы это отображалось как значение времени дня.)

Ответ 2

Вы можете использовать timespan

TimeSpan timeSpan = new TimeSpan(2, 14, 18);
Console.WriteLine(timeSpan.ToString());     // Displays "02:14:18".

[Изменить]
Принимая во внимание другие ответы и редактирование вопроса, я все равно буду использовать TimeSpan. Нет смысла создавать новую структуру, в которой достаточно существующего из рамки.
В этих строках вы должны дублировать многие собственные типы данных.

Ответ 3

Если этот пустой Date действительно вас задевает, вы также можете создать более простую структуру Time:

// more work is required to make this even close to production ready
class Time
{
    // TODO: don't forget to add validation
    public int Hours   { get; set; }
    public int Minutes { get; set; }
    public int Seconds { get; set; }

    public override string ToString()
    {  
        return String.Format(
            "{0:00}:{1:00}:{2:00}",
            this.Hours, this.Minutes, this.Seconds);
    }
}

Или, зачем беспокоиться: если вам не нужно делать какие-либо вычисления с этой информацией, просто сохраните ее как String.

Ответ 4

Я использую DateTime. Если вам не нужна дата, просто проигнорируйте ее. Если вам нужно отобразить только время для пользователя, выведите его в формате для пользователя следующим образом:

DateTime.Now.ToString("t");  // outputs 10:00 PM

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

Ответ 5

Я считаю, что класс Рубенса - это хорошая идея, поэтому считается, что он делает неизменный образец своего класса Time с базовой проверкой.

class Time
{
    public int Hours   { get; private set; }
    public int Minutes { get; private set; }
    public int Seconds { get; private set; }

    public Time(uint h, uint m, uint s)
    {
        if(h > 23 || m > 59 || s > 59)
        {
            throw new ArgumentException("Invalid time specified");
        }
        Hours = (int)h; Minutes = (int)m; Seconds = (int)s;
    }

    public Time(DateTime dt)
    {
        Hours = dt.Hour;
        Minutes = dt.Minute;
        Seconds = dt.Second;
    }

    public override string ToString()
    {  
        return String.Format(
            "{0:00}:{1:00}:{2:00}",
            this.Hours, this.Minutes, this.Seconds);
    }
}

Ответ 6

В дополнение к Chibueze Opata​​strong > :

class Time
{
    public int Hours   { get; private set; }
    public int Minutes { get; private set; }
    public int Seconds { get; private set; }

    public Time(uint h, uint m, uint s)
    {
        if(h > 23 || m > 59 || s > 59)
        {
            throw new ArgumentException("Invalid time specified");
        }
        Hours = (int)h; Minutes = (int)m; Seconds = (int)s;
    }

    public Time(DateTime dt)
    {
        Hours = dt.Hour;
        Minutes = dt.Minute;
        Seconds = dt.Second;
    }

    public override string ToString()
    {  
        return String.Format(
            "{0:00}:{1:00}:{2:00}",
            this.Hours, this.Minutes, this.Seconds);
    }

    public void AddHours(uint h)
    {
        this.Hours += (int)h;
    }

    public void AddMinutes(uint m)
    {
        this.Minutes += (int)m;
        while(this.Minutes > 59)
            this.Minutes -= 60;
            this.AddHours(1);
    }

    public void AddSeconds(uint s)
    {
        this.Seconds += (int)s;
        while(this.Seconds > 59)
            this.Seconds -= 60;
            this.AddMinutes(1);
    }
}

Ответ 7

Если вы не хотите использовать DateTime или TimeSpan и хотите сохранить время суток, вы можете просто сохранить секунды с полуночи в Int32 или (если вы даже не хотите секунд), минуты с полуночи вписывались в Int16. Было бы тривиально написать несколько методов, необходимых для доступа к часам, минутам и секундам от такого значения.

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

(Конечно, если вы используете простую схему, подобную приведенной выше, завернутую в класс, тогда также было бы тривиально заменить хранилище на TimeSpan в будущем, если вы вдруг поймете, что это даст вам преимущество)