public void TestTimeMomentRangeYear()
        {
            DateTimeOffset now = DateTimeOffset.Now;

            TimeMomentRange dtr = TimeUnits.Year.Current((DateTimeOffset) new DateTime(now.Year, 5, 1, 11, 46, 38));

            DateTimeOffset expectedStart = now.StartOf(TimeUnits.Year);
            DateTimeOffset expectedEnd   = now.EndOf(TimeUnits.Year);

            Assert.AreEqual(expectedStart, dtr.Start.Value);
            Assert.AreEqual(expectedEnd, dtr.End.Value);
        }
        public void TestTimeMomentRangeMonth()
        {
            DateTimeOffset now = DateTimeOffset.Now;

            TimeMomentRange dtr = TimeUnits.Month.Current((DateTimeOffset) new DateTime(2013, 5, 15, 11, 46, 38));

            DateTimeOffset expectedStart = now.StartOf(TimeUnits.Month);
            DateTimeOffset expectedEnd   = now.EndOf(TimeUnits.Month);

            Assert.AreEqual(expectedStart, dtr.Start.Value);
            Assert.AreEqual(expectedEnd, dtr.End.Value);

            dtr           = TimeUnits.Month.Current();
            expectedStart = now.StartOf(TimeUnits.Month);
            expectedEnd   = now.EndOf(TimeUnits.Month);
            Assert.AreEqual(expectedStart, dtr.Start.Value);
            Assert.AreEqual(expectedEnd, dtr.End.Value);
        }
        /// <summary>
        /// Warning: bug found. dt.Offset may be incorrect as offsets could be different if range crosses daylight saving switch, i.e. October - December, or month of November in the EST USA.
        /// </summary>
        /// <param name="referenceMoment"></param>
        /// <returns></returns>
        public TimeMomentRange GetTimeMomentRange(DateTimeOffset? referenceMoment = null)
        {
            DateTime? refMoment = referenceMoment == null ? (DateTime?)null : new DateTime(referenceMoment.Value.UtcDateTime.Ticks);
            #pragma warning disable 618
            DateRange derange = this.GetDateTimeRange(refMoment);
            #pragma warning restore 618

            DateTimeOffset? starto, endo;

            if(referenceMoment == null)
            {
                starto = derange.HasStart ? derange.Start.Value : (DateTimeOffset?)null;
                endo = derange.HasEnd ? derange.End.Value : (DateTimeOffset?)null;
            } else
            {
                TimeSpan utcOffset = referenceMoment.Value.Offset;

                starto = derange.HasStart ? new DateTimeOffset(derange.Start.Value, utcOffset) : (DateTimeOffset?)null;
                endo = derange.HasEnd ? new DateTimeOffset(derange.End.Value, utcOffset) : (DateTimeOffset?)null;
            }

            TimeMomentRange range = new TimeMomentRange(starto, endo);
            return range;
        }