¿Cómo represento un valor de tiempo solo en .NET?

¿Hay alguna manera de poder representar un valor de tiempo solo en .NET sin la fecha? Por ejemplo, ¿indicando el horario de apertura de una tienda?

TimeSpan indica un rango, mientras que solo quiero almacenar un valor de tiempo. Usar DateTime para indicar esto daría como resultado un nuevo DateTime(1,1,1,8,30,0) que no es realmente deseable.

Como han dicho otros, puede usar un DateTime e ignorar la fecha, o usar un TimeSpan . Personalmente, no estoy interesado en ninguna de estas soluciones, ya que ninguno de los dos tipos refleja realmente el concepto que intentas representar. Considero que los tipos de fecha y hora en .NET son un poco escasos, lo cual es una de las razones por las que comencé. Noda Time . En Noda Time, puede usar el tipo LocalTime para representar una hora del día.

Una cosa a tener en cuenta: la hora del día no es necesariamente la cantidad de tiempo desde la medianoche del mismo día …

(Como otro lado, si también desea representar una hora de cierre de una tienda, puede encontrar que desea representar las 24:00, es decir, la hora al final del día. La mayoría de las API de fecha / hora, incluida Noda Tiempo: no permita que eso se represente como valor de la hora del día).

Puedes usar un intervalo de tiempo

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

[Editar]
Considerando las otras respuestas y la edición de la pregunta, aún usaría TimeSpan. No tiene sentido crear una nueva estructura donde baste una existente del marco.
En estas líneas, terminarías duplicando muchos tipos de datos nativos.

Si esa Date vacía realmente te molesta, también puedes crear una estructura de Time más simple:

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

O bien, por qué molestarse: si no necesita hacer ningún cálculo con esa información, simplemente guárdela como String .

Yo digo que use un DateTime. Si no necesita la porción de fecha, simplemente ignórela. Si necesita mostrar solo el tiempo al usuario, déle formato al usuario de esta manera:

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

Parece que todo el trabajo adicional de hacer una nueva clase o incluso usar un TimeSpan es innecesario.

Creo que la clase de Rubens es una buena idea, así que pensé en hacer una muestra inmutable de su clase de tiempo con validación básica.

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

Además de Chibueze Opata :

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

Si no desea utilizar DateTime o TimeSpan, y solo desea almacenar la hora del día, puede almacenar los segundos desde la medianoche en un Int32, o (si no quiere segundos) los minutos desde la medianoche. cabría en un Int16. Sería trivial escribir los pocos métodos necesarios para acceder a Hour, Minute y Second desde dicho valor.

La única razón por la que puedo pensar para evitar DateTime / TimeSpan sería si el tamaño de la estructura es crítico.

(Por supuesto, si usa un esquema simple como el anterior en una clase, entonces también sería trivial reemplazar el almacenamiento con un TimeSpan en el futuro si de repente se da cuenta de que eso le daría una ventaja)