public DateRange GetDateTimeRange(DateTime? referenceMoment)
{
DateTime refMoment = referenceMoment.IsNullOrDefault() ? (this.Unit.IsMomentInTime() ? DateTime.UtcNow : DateTime.Now) : referenceMoment.Value;
DateTime? start = null, end = null;
switch(this.Direction)
{
case Timeline.EntireCurrentOrSpecified:
start = refMoment.StartOf(this.Unit);
end = refMoment.EndOf(this.Unit);
break;
case Timeline.ToDateOrTillSpecified:
start = refMoment.StartOf(this.Unit);
end = refMoment; // refMoment.EndOf(TimeUnits.Day);
break;
case Timeline.Past:
end = refMoment;
start = this.Unit == TimeUnits.Eternity ? (DateTime?)null : end.Value.Add(-(int)this.UnitCount, this.Unit);
break;
case Timeline.Future:
start = refMoment;
end = this.Unit == TimeUnits.Eternity ? (DateTime?)null : start.Value.Add((int)this.UnitCount, this.Unit);
break;
case Timeline.PreviousExcludingCurrent:
end = refMoment.StartOf(this.Unit);
start = end.Value.Add(-(int)this.UnitCount, this.Unit);
end = end.Value.PreviousMoment();
break;
case Timeline.NextExcludingCurrent:
start = refMoment.StartOf(this.Unit).Add(1, this.Unit);
end = start.Value.Add((int)this.UnitCount, this.Unit);
break;
}
DateRange range = new DateRange(start, end);
return range;
}