コード例 #1
0
        public static DateTime RoundDateTime(this DateTime dt, int minutes, RoundingDirection direction)
        {
            if (minutes == 0)
            {
                return(dt);
            }

            TimeSpan d = TimeSpan.FromMinutes(minutes);

            long delta    = 0;
            long modTicks = dt.Ticks % d.Ticks;

            switch (direction)
            {
            case RoundingDirection.Up:
                delta = modTicks != 0 ? d.Ticks - modTicks : 0;
                break;

            case RoundingDirection.Down:
                delta = -modTicks;
                break;

            case RoundingDirection.Nearest:
            {
                bool roundUp = modTicks > d.Ticks / 2;
                var  offset  = roundUp ? d.Ticks : 0;
                delta = offset - modTicks;
                break;
            }
            }
            return(new DateTime(dt.Ticks + delta, dt.Kind));
        }
コード例 #2
0
        public void TestRoundToTimeOfDay(string test, RoundingDirection direction, string expected)
        {
            var testDate     = DateTimeOffset.ParseExact(test, AppConfigHelper.Iso8601FormatNoFractionalSeconds, CultureInfo.InvariantCulture);
            var expectedDate = DateTimeOffset.ParseExact(expected, AppConfigHelper.Iso8601FormatNoFractionalSeconds, CultureInfo.InvariantCulture);

            var actual = testDate.RoundToTimeOfDay(new TimeSpan(11, 30, 0), direction);

            Assert.AreEqual(expectedDate, actual);
        }
コード例 #3
0
ファイル: EnhancedMath.cs プロジェクト: zacwhy/MvcExpense
 private static double Round( double value, int precision, RoundingDirection roundingDirection )
 {
     RoundingFunction roundingFunction;
     if ( roundingDirection == RoundingDirection.Up )
         roundingFunction = Math.Ceiling;
     else
         roundingFunction = Math.Floor;
     value *= Math.Pow( 10, precision );
     value = roundingFunction( value );
     return value * Math.Pow( 10, -1 * precision );
 }
コード例 #4
0
        public static LocalDateTime ToNearestHour(this LocalDateTime dateTime, RoundingDirection direction)
        {
            if (dateTime.Minute == 0)
            {
                return(dateTime);
            }


            return(direction == RoundingDirection.Up
                ? dateTime.PlusMinutes(60 - dateTime.Minute)
                : dateTime.PlusMinutes(-dateTime.Minute));
        }
コード例 #5
0
ファイル: Rounding.cs プロジェクト: TNOCS/csTouch
 /// <summary>
 /// Rounds a date value to a given minute interval
 /// </summary>
 /// <param name="time">Original time value</param>
 /// <param name="minuteInterval">Number of minutes to round up or down to</param>
 /// <param name="direction"></param>
 /// <returns></returns>
 public static DateTime RoundDateToMinuteInterval(DateTime time, long minuteInterval,
                          RoundingDirection direction)
 {
   //TimeSpan.TicksPerMinute 
   if (minuteInterval > 0)
   {
     long t = time.Ticks / (TimeSpan.TicksPerSecond * minuteInterval);
     DateTime nt = new DateTime(t * minuteInterval * TimeSpan.TicksPerSecond);
     return nt;
   }
   return time;    
 }
コード例 #6
0
        private static double Round(double value, int precision, RoundingDirection roundingDirection)
        {
            RoundingFunction roundingFunction;

            if (roundingDirection == RoundingDirection.Up)
            {
                roundingFunction = Math.Ceiling;
            }
            else
            {
                roundingFunction = Math.Floor;
            }
            value *= Math.Pow(10, precision);
            value  = roundingFunction(value);
            return(value * Math.Pow(10, -1 * precision));
        }
コード例 #7
0
        /// <summary>
        /// Round a date to a time of day.
        /// </summary>
        /// <remarks>
        /// Unlike the other rounding methods (which accept an interval), this method
        /// will only output values that are 24-hours apart so that values always align
        /// to the supplied <paramref name="timeOfDay"/>.
        /// </remarks>
        /// <param name="date">The date to round.</param>
        /// <param name="timeOfDay">The time of day to round to.</param>
        /// <param name="direction">The behaviour of the rounding operation.</param>
        /// <returns>A rounded date.</returns>
        public static DateTimeOffset RoundToTimeOfDay(
            this DateTimeOffset date,
            TimeSpan timeOfDay,
            RoundingDirection direction)
        {
            var time = date.TimeOfDay;

            if (time == timeOfDay)
            {
                return(date);
            }

            TimeSpan delta;

            if (direction == RoundingDirection.AwayFromZero)
            {
                var roundDelta = timeOfDay.Subtract(time);
                if (roundDelta.Absolute() < TimeSpan.FromHours(12))
                {
                    delta = timeOfDay;
                }
                else if (roundDelta < TimeSpan.Zero)
                {
                    delta = timeOfDay + TimeSpan.FromDays(1);
                }
                else
                {
                    delta = timeOfDay - TimeSpan.FromDays(1);
                }
            }
            else if (direction == RoundingDirection.Ceiling)
            {
                delta = time < timeOfDay ? timeOfDay : timeOfDay + TimeSpan.FromDays(1);
            }
            else if (direction == RoundingDirection.Floor)
            {
                delta = time >= timeOfDay ? timeOfDay : timeOfDay - TimeSpan.FromDays(1);
            }
            else
            {
                throw new ArgumentOutOfRangeException(nameof(direction));
            }

            var dayOf = new DateTimeOffset(date.Date.Add(delta), date.Offset);

            return(dayOf);
        }
コード例 #8
0
    private static float Round(float value, int precision,
                               RoundingDirection roundingDirection)
    {
        RoundingFunction roundingFunction;

        if (roundingDirection == RoundingDirection.Up)
        {
            roundingFunction = Mathf.Ceil;
        }
        else
        {
            roundingFunction = Mathf.Floor;
        }
        value *= Mathf.Pow(10, precision);
        value  = roundingFunction(value);
        return(value * Mathf.Pow(10, -1 * precision));
    }
コード例 #9
0
ファイル: FormatHelper.cs プロジェクト: fokion/MediaPortal-2
        public static DateTime RoundDateTime(DateTime dt, int minutes, RoundingDirection direction)
        {
            TimeSpan t;

              switch (direction)
              {
            case RoundingDirection.Up:
              t = (dt.Subtract(DateTime.MinValue)).Add(new TimeSpan(0, minutes, 0)); break;
            case RoundingDirection.Down:
              t = (dt.Subtract(DateTime.MinValue)); break;
            default:
              t = (dt.Subtract(DateTime.MinValue)).Add(new TimeSpan(0, minutes / 2, 0)); break;
              }

              return DateTime.MinValue.Add(new TimeSpan(0,
             (((int)t.TotalMinutes) / minutes) * minutes, 0));
        }
コード例 #10
0
        /// <summary>
        /// Rounds a TimeSpan based on the provided values.
        /// </summary>
        /// <param name="ts">The extension target.</param>
        /// <param name="Direction">The direction in which to round.</param>
        /// <param name="MinutePrecision">The precision to round to.</param>
        /// <returns>A new TimeSpan based on the provided values.</returns>
        public static TimeSpan Round(this TimeSpan ts, RoundingDirection Direction, int MinutePrecision)
        {
            if (Direction == RoundingDirection.Up)
            {
                return(TimeSpan.FromMinutes(
                           MinutePrecision * Math.Ceiling(ts.TotalMinutes / MinutePrecision)));
            }

            if (Direction == RoundingDirection.Down)
            {
                return(TimeSpan.FromMinutes(
                           MinutePrecision * Math.Floor(ts.TotalMinutes / MinutePrecision)));
            }

            // Really shouldn't be able to get here...
            return(ts);
        }
コード例 #11
0
        public static DateTime RoundDateTime(DateTime dt, int minutes, RoundingDirection direction)
        {
            TimeSpan t;

            switch (direction)
            {
            case RoundingDirection.Up:
                t = (dt.Subtract(DateTime.MinValue)).Add(new TimeSpan(0, minutes, 0)); break;

            case RoundingDirection.Down:
                t = (dt.Subtract(DateTime.MinValue)); break;

            default:
                t = (dt.Subtract(DateTime.MinValue)).Add(new TimeSpan(0, minutes / 2, 0)); break;
            }

            return(DateTime.MinValue.Add(new TimeSpan(0,
                                                      (((int)t.TotalMinutes) / minutes) * minutes, 0)));
        }
コード例 #12
0
        /// <summary>
        /// Rounds an hours value to a minute interval
        /// 0 means no rounding
        /// </summary>
        /// <param name="minuteInterval">Minutes to round up or down to</param>
        /// <returns></returns>
        public static decimal RoundDateToMinuteInterval(decimal hours, int minuteInterval,
                                                        RoundingDirection direction)
        {
            if (minuteInterval == 0)
            {
                return(hours);
            }

            decimal fraction = 60 / minuteInterval;

            switch (direction)
            {
            case RoundingDirection.Round:
                return(Math.Round(hours * fraction, 0) / fraction);

            case RoundingDirection.RoundDown:
                return(Math.Truncate(hours * fraction) / fraction);
            }
            return(Math.Ceiling(hours * fraction) / fraction);
        }
コード例 #13
0
        /// <summary>
        /// Rounds a date value to a given minute interval
        /// </summary>
        /// <param name="time">Original time value</param>
        /// <param name="minuteInterval">Number of minutes to round up or down to</param>
        /// <returns></returns>
        public static DateTime RoundDateToMinuteInterval(DateTime time, int minuteInterval,
                                                         RoundingDirection direction)
        {
            if (minuteInterval == 0)
            {
                return(time);
            }

            decimal interval  = (decimal)minuteInterval;
            decimal actMinute = (decimal)time.Minute;

            if (actMinute == 0.00M)
            {
                return(time);
            }

            int newMinutes = 0;

            switch (direction)
            {
            case RoundingDirection.Round:
                newMinutes = (int)(Math.Round(actMinute / interval, 0) * interval);
                break;

            case RoundingDirection.RoundDown:
                newMinutes = (int)(Math.Truncate(actMinute / interval) * interval);
                break;

            case RoundingDirection.RoundUp:
                newMinutes = (int)(Math.Ceiling(actMinute / interval) * interval);
                break;
            }

            // strip time
            time = time.AddMinutes(time.Minute * -1);
            time = time.AddSeconds(time.Second * -1);
            time = time.AddMilliseconds(time.Millisecond * -1);

            // add new minutes back on
            return(time.AddMinutes(newMinutes));
        }
コード例 #14
0
        /// <summary>
        /// Rounds a date value to a given minute interval
        /// </summary>
        /// <param name="time">Original time value</param>
        /// <param name="minuteInterval">Number of minutes to round up or down to</param>
        /// <returns></returns>
        public static DateTime RoundDateToMinuteInterval(DateTime time, int minuteInterval,
            RoundingDirection direction)
        {
            if (minuteInterval == 0)
                return time;

            decimal interval = (decimal)minuteInterval;
            decimal actMinute = (decimal)time.Minute;

            if (actMinute == 0.00M)
                return time;

            int newMinutes = 0;

            switch (direction)
            {
                case RoundingDirection.Round:
                    newMinutes = (int)(Math.Round(actMinute / interval, 0) * interval);
                    break;
                case RoundingDirection.RoundDown:
                    newMinutes = (int)(Math.Truncate(actMinute / interval) * interval);
                    break;
                case RoundingDirection.RoundUp:
                    newMinutes = (int)(Math.Ceiling(actMinute / interval) * interval);
                    break;
            }

            // strip time
            time = time.AddMinutes(time.Minute * -1);
            time = time.AddSeconds(time.Second * -1);
            time = time.AddMilliseconds(time.Millisecond * -1);

            // add new minutes back on
            return time.AddMinutes(newMinutes);
        }
コード例 #15
0
        /// <summary>
        /// Rounds an hours value to a minute interval
        /// 0 means no rounding
        /// </summary>
        /// <param name="minuteInterval">Minutes to round up or down to</param>
        /// <returns></returns>
        public static decimal RoundDateToMinuteInterval(decimal hours, int minuteInterval,
            RoundingDirection direction)
        {
            if (minuteInterval == 0)
                return hours;

            decimal fraction = 60 / minuteInterval;

            switch (direction)
            {
                case RoundingDirection.Round:
                    return Math.Round(hours * fraction, 0) / fraction;
                case RoundingDirection.RoundDown:
                    return Math.Truncate(hours * fraction) / fraction;

            }
            return Math.Ceiling(hours * fraction) / fraction;
        }
コード例 #16
0
        /// <summary>
        /// Rounds datetime up, down or to nearest minutes and all smaller units to zero
        /// </summary>
        /// <param name="dt">static extension method</param>
        /// <param name="rndmin">mins to round to</param>
        /// <param name="directn">Up,Down,Nearest</param>
        /// <returns>rounded TimeSpan with all smaller units than mins rounded off</returns>
        /// <remarks>http://metadataconsulting.blogspot.com/2018/10/C-Round-Datetime-Extension-To-Nearest-Minute-And-Smaller-Units-Are-Rounded-To-Zero.html</remarks>
        public static TimeSpan RoundToNearestMinute(this TimeSpan dt, int rndmin = 1, RoundingDirection directn = RoundingDirection.Nearest)
        {
            if (rndmin == 0) //can be > 60 mins
            {
                return(dt);
            }

            TimeSpan d = TimeSpan.FromMinutes(rndmin); //this can be passed as a parameter, or use any timespan unit FromDays, FromHours, etc.

            long  delta    = 0;
            Int64 modTicks = dt.Ticks % d.Ticks;

            switch (directn)
            {
            case RoundingDirection.Up:
                delta = modTicks != 0 ? d.Ticks - modTicks : 0;
                break;

            case RoundingDirection.Down:
                delta = -modTicks;
                break;

            case RoundingDirection.Nearest:
            {
                bool roundUp = modTicks > (d.Ticks / 2);
                var  offset  = roundUp ? d.Ticks : 0;
                delta = offset - modTicks;
                break;
            }
            }
            return(new TimeSpan(dt.Ticks + delta));
        }