/// <summary>
 /// Static constructor initializing the defined databased to hardcoded values.
 /// </summary>
 static TimeResolution()
 {
     Millisecond = new TimeResolution(TimeResolutionType.Milliseconds, 1);
     Second = new TimeResolution(TimeResolutionType.Seconds, 1);
     Minute = new TimeResolution(TimeResolutionType.Minute, 1);
     Minute5th = new TimeResolution(TimeResolutionType.Minute, 5);
     Minute6th = new TimeResolution(TimeResolutionType.Minute, 6);
     Minute10th = new TimeResolution(TimeResolutionType.Minute, 10);
     Minute12th = new TimeResolution(TimeResolutionType.Minute, 12);
     Minute15th = new TimeResolution(TimeResolutionType.Minute, 15);
     Minute20th = new TimeResolution(TimeResolutionType.Minute, 20);
     Minute30th = new TimeResolution(TimeResolutionType.Minute, 30);
     Hour = new TimeResolution(TimeResolutionType.Hour, 1);
     Day = new TimeResolution(TimeResolutionType.Day, 1);
     Week = new TimeResolution(TimeResolutionType.Day, 7);
     Month = new TimeResolution(TimeResolutionType.Day, 30); // Inaccurate
     Quarter = new TimeResolution(TimeResolutionType.Day, 91); // More Inaccurate
     Season = new TimeResolution(TimeResolutionType.Day, 182); // More Inaccurate
     Year = new TimeResolution(TimeResolutionType.Day, 365); // Inaccurate
 }
        public static bool IsValid(UtcDateTime time, TimeResolution res, TimeSpan resolutionSpan)
        {
            var span = time.UtcTime.TimeOfDay;
            var span2 = resolutionSpan;
            if (Millisecond.ToTimeSpan() == resolutionSpan) return true;
            if (Second.ToTimeSpan() == resolutionSpan) return EqualMilliseconds(span, span2);
            if (Minute.ToTimeSpan() == resolutionSpan) return EqualSeconds(span, span2) && EqualMilliseconds(span, span2);
            if (Minute5th.ToTimeSpan() == resolutionSpan) return EqualMinutes(span, span2, Minute5th.IntervalStepInResolution) && EqualSeconds(span, span2) && EqualMilliseconds(span, span2);
            if (Minute6th.ToTimeSpan() == resolutionSpan) return EqualMinutes(span, span2, Minute6th.IntervalStepInResolution) && EqualSeconds(span, span2) && EqualMilliseconds(span, span2);
            if (Minute10th.ToTimeSpan() == resolutionSpan) return EqualMinutes(span, span2, Minute10th.IntervalStepInResolution) && EqualSeconds(span, span2) && EqualMilliseconds(span, span2);
            if (Minute12th.ToTimeSpan() == resolutionSpan) return EqualMinutes(span, span2, Minute12th.IntervalStepInResolution) && EqualSeconds(span, span2) && EqualMilliseconds(span, span2);
            if (Minute15th.ToTimeSpan() == resolutionSpan) return EqualMinutes(span, span2, Minute15th.IntervalStepInResolution) && EqualSeconds(span, span2) && EqualMilliseconds(span, span2);
            if (Minute20th.ToTimeSpan() == resolutionSpan) return EqualMinutes(span, span2, Minute20th.IntervalStepInResolution) && EqualSeconds(span, span2) && EqualMilliseconds(span, span2);
            if (Minute30th.ToTimeSpan() == resolutionSpan) return EqualMinutes(span, span2, Minute30th.IntervalStepInResolution) && EqualSeconds(span, span2) && EqualMilliseconds(span, span2);
            if (Hour.ToTimeSpan() == resolutionSpan) return EqualMinutes(span, span2, 0) && EqualSeconds(span, span2) && EqualMilliseconds(span, span2);
            // Cannot implement the rest without time zone data and probably a base time point.

            throw new Exception("Unable to verify TimeResolution.Type and cannot infer provided time's resolution. Type: " + res.Type);
        }