No hay un tipo incorporado que defina un rango de tiempo, pero sería bastante fácil crear uno combinando un DateTime
y un TimeSpan
. Por ejemplo:
struct TimeRange
{
private readonly DateTime start;
private readonly TimeSpan duration;
public TimeRange (DateTime start, TimeSpan duration)
{
this.start = start;
this.duration = duration;
}
}
A continuación, podría construir una List<TimeRange>
utilizando una específica DateTime
como punto de partida y añadiendo la TimeSpan
requerida para cada elemento. Por ejemplo, aquí hay una implementación muy básica de TimeRange
que incluye un método llamado Split
que devuelve un IEnumerable<TimeRange>
basado en el actual TimeRange
y la duración requerida de los subintervalos.
struct TimeRange
{
private readonly DateTime start;
private readonly TimeSpan duration;
public TimeRange (DateTime start, TimeSpan duration)
{
this.start = start;
this.duration = duration;
}
public DateTime From { get { return start; } }
public DateTime To { get { return start + duration; } }
public TimeSpan Duration { get { return duration; } }
public IEnumerable<TimeRange> Split (TimeSpan subDuration)
{
for (DateTime subRangeStart = From; subRangeStart < this.To; subRangeStart += subDuration)
{
yield return new TimeRange(subRangeStart, subDuration);
}
}
public override string ToString()
{
return String.Format ("{0} -> {1}", From, To);
}
}
A continuación, puede hacer algo como esto:
TimeRange mainRange = new TimeRange(DateTime.Now, new TimeSpan(12, 0, 0));
List<TimeRange> rangeList = mainRange.Split(new TimeSpan(1, 0, 0)).ToList();
Esto le dará una lista de 12 intervalos de tiempo de duración de 1 hora a partir de la hora actual.
** Actualización **
Tenga en cuenta que la aplicación anterior es muy básico. El método Split
, por ejemplo, producirá felizmente un lits de rangos donde el final del último subintervalo está más allá del final del rango principal si la sub-duración no es una división integral del rango principal. Sin embargo, sería difícil agregar cheques para este tipo de cosas. La verdadera pregunta es qué quieres que suceda en ese tipo de escenarios.
También sería muy fácil crear un método TimeRange.CreateList
estático que genere un List<TimeRange>
sin la necesidad de un rango primario explícito.
Esta es una muy buena respuesta. Si la duración se establece en 2, ¿obtengo exactamente 2 horas? por ejemplo: TimeRange (10,2) así que obtengo 10 a 12 como un rango? –
Tengo la tentación de decir "pruébalo y ve" pero, sí, eso es lo que obtendrás. También puede usar una duración de 'new TimeSpan (1, 30, 0)' para obtener un rango de 1,5 horas (por ejemplo, de 10:00 a 11:30), por ejemplo. –
Muchas gracias por su respuesta. –