c# - modify - ¿Cómo represento un valor de tiempo único en.NET?
saving user settings c# (7)
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);
}
}
¿Hay alguna manera de que uno pueda representar un valor de solo hora 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 resultaría en 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 está tratando de representar. Considero que los tipos de fecha / hora en .NET son algo así como una de las razones por las que comencé Tiempo de noda . En Noda Time, puede usar el tipo LocalTime
para representar una hora del día.
Una cosa a considerar: la hora del día no es necesariamente la duración desde la medianoche del mismo día ...
(Aparte de eso, si también desea representar un horario de cierre de una tienda, puede que desee representar las 24:00, es decir, la hora al final del día. La mayoría de las API de fecha / hora, incluida Noda Hora: no permita que se represente como un valor de hora del día.)
Creo que la clase de Rubens es una buena idea, así que se piensa que es una muestra inmutable de su clase Time 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);
}
}
Puedes usar el timespan
TimeSpan timeSpan = new TimeSpan(2, 14, 18);
Console.WriteLine(timeSpan.ToString()); // Displays "02:14:18".
[Editar]
Teniendo en cuenta las otras respuestas y la edición de la pregunta, todavía usaría TimeSpan. No tiene sentido crear una nueva estructura donde sea suficiente una existente desde el 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 realizar ningún cálculo con esa información, simplemente guárdelo como String
.
Si no desea utilizar un 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 encajaría en un int16. Sería trivial escribir los pocos métodos necesarios para acceder a la Hora, Minuto y Segundo desde dicho valor.
La única razón que se me ocurre 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 que se incluye arriba en una clase, sería trivial reemplazar el almacenamiento con un TimeSpan en el futuro si de repente se da cuenta de que eso le dará una ventaja)
Yo digo usar un DateTime. Si no necesita la parte de la fecha, simplemente ignórela. Si necesita mostrarle solo el tiempo al usuario, déjelo formateado para el usuario de esta manera:
DateTime.Now.ToString("t"); // outputs 10:00 PM
Parece que todo el trabajo adicional de crear una nueva clase o incluso usar un TimeSpan es innecesario.