Пример #1
0
        /// <summary>
        /// Rounds the specified date time.
        /// </summary>
        /// <param name="dateTime">The date time.</param>
        /// <param name="dateTimeRoundingAccuracy">The date time rounding accuracy.</param>
        /// <param name="midpointRounding">The midpoint rounding.</param>
        /// <returns></returns>
        public static DateTime Round(this DateTime dateTime, DateTimeRoundingAccuracy dateTimeRoundingAccuracy, MidpointRounding midpointRounding)
        {
            switch (midpointRounding)
            {
            case MidpointRounding.AwayFromZero:

                switch (dateTimeRoundingAccuracy)
                {
                case DateTimeRoundingAccuracy.Millisecond: return(new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, dateTime.Second, 0, dateTime.Kind));

                case DateTimeRoundingAccuracy.Second: return(new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, 0, 0, dateTime.Kind));

                case DateTimeRoundingAccuracy.Minute: return(new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, 0, 0, 0, dateTime.Kind));

                case DateTimeRoundingAccuracy.Hour: return(new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 0, 0, 0, 0, dateTime.Kind));

                case DateTimeRoundingAccuracy.Day: return(new DateTime(dateTime.Year, dateTime.Month, 1, 0, 0, 0, 0, dateTime.Kind));

                case DateTimeRoundingAccuracy.Month: return(new DateTime(dateTime.Year, 1, 1, 0, 0, 0, 0, dateTime.Kind));

                default: throw new NotSupportedException();
                }

            case MidpointRounding.ToEven:

                int    s, m, h, d, mm, daysInMonth;
                double ms = 0;

                switch (dateTimeRoundingAccuracy)
                {
                case DateTimeRoundingAccuracy.Millisecond:
                    #region Millisecond

                    return(dateTime.AddMilliseconds(
                               dateTime.Millisecond >= 500 ? 1000 - dateTime.Millisecond
                                              : dateTime.Millisecond * -1));

                    #endregion

                case DateTimeRoundingAccuracy.Second:
                    #region Second
                    if (dateTime.Millisecond >= 500)
                    {
                        s   = dateTime.Second + 1;
                        ms += 1000 - dateTime.Millisecond;
                    }
                    else
                    {
                        s   = dateTime.Second;
                        ms -= dateTime.Millisecond;
                    }

                    if (s >= 30 && s < 60)
                    {
                        ms += 1000;
                    }

                    return(dateTime.AddMilliseconds(ms));

                    #endregion

                case DateTimeRoundingAccuracy.Minute:
                    #region Minute
                    if (dateTime.Millisecond >= 500)
                    {
                        s   = dateTime.Second + 1;
                        ms += 1000 - dateTime.Millisecond;
                    }
                    else
                    {
                        s   = dateTime.Second;
                        ms -= dateTime.Millisecond;
                    }

                    if (s >= 60)
                    {
                        m = dateTime.Minute + 1;
                    }
                    else if (s >= 30)
                    {
                        m   = dateTime.Minute + 1;
                        ms += 1000;
                    }
                    else
                    {
                        m = dateTime.Minute;
                    }

                    if (m >= 30 && m < 60)
                    {
                        ms += 60000;
                    }

                    return(dateTime.AddMilliseconds(ms));

                    #endregion

                case DateTimeRoundingAccuracy.Hour:
                    #region Hour
                    if (dateTime.Millisecond >= 500)
                    {
                        s   = dateTime.Second + 1;
                        ms += 1000 - dateTime.Millisecond;
                    }
                    else
                    {
                        s   = dateTime.Second;
                        ms -= dateTime.Millisecond;
                    }

                    if (s >= 60)
                    {
                        m = dateTime.Minute + 1;
                    }
                    else if (s >= 30)
                    {
                        m   = dateTime.Minute + 1;
                        ms += 1000;
                    }
                    else
                    {
                        m = dateTime.Minute;
                    }

                    if (m >= 60)
                    {
                        h = dateTime.Hour + 1;
                    }
                    else if (m >= 30)
                    {
                        h   = dateTime.Hour + 1;
                        ms += 60000;
                    }
                    else
                    {
                        h = dateTime.Hour;
                    }

                    if (h >= 12 && h < 24)
                    {
                        ms += 3600000;
                    }

                    return(dateTime.AddMilliseconds(ms));

                    #endregion

                case DateTimeRoundingAccuracy.Day:
                    #region Day

                    if (dateTime.Millisecond >= 500)
                    {
                        s   = dateTime.Second + 1;
                        ms += 1000 - dateTime.Millisecond;
                    }
                    else
                    {
                        s   = dateTime.Second;
                        ms -= dateTime.Millisecond;
                    }

                    if (s >= 60)
                    {
                        m = dateTime.Minute + 1;
                    }
                    else if (s >= 30)
                    {
                        m   = dateTime.Minute + 1;
                        ms += 1000;
                    }
                    else
                    {
                        m = dateTime.Minute;
                    }

                    if (m >= 60)
                    {
                        h = dateTime.Hour + 1;
                    }
                    else if (m >= 30)
                    {
                        h   = dateTime.Hour + 1;
                        ms += 60000;
                    }
                    else
                    {
                        h = dateTime.Hour;
                    }

                    if (h >= 24)
                    {
                        d = dateTime.Day + 1;
                    }
                    else if (h >= 12)
                    {
                        d   = dateTime.Day + 1;
                        ms += 3600000;
                    }
                    else
                    {
                        d = dateTime.Day;
                    }

                    daysInMonth = DateTime.DaysInMonth(dateTime.Year, dateTime.Month);
                    if (d >= daysInMonth / 2 && d < daysInMonth)
                    {
                        ms += (daysInMonth - d) * 86400000;
                    }

                    return(dateTime.AddMilliseconds(ms));

                    #endregion

                case DateTimeRoundingAccuracy.Month:
                    #region month
                    if (dateTime.Millisecond >= 500)
                    {
                        s = dateTime.Second + 1;
                    }
                    else
                    {
                        s   = dateTime.Second;
                        ms -= dateTime.Millisecond;
                    }

                    if (s >= 60)
                    {
                        m = dateTime.Minute + 1;
                    }
                    else if (s >= 30)
                    {
                        m   = dateTime.Minute + 1;
                        ms += 1000;
                    }
                    else
                    {
                        m = dateTime.Minute;
                    }

                    if (m >= 60)
                    {
                        h = dateTime.Hour + 1;
                    }
                    else if (m >= 30)
                    {
                        h   = dateTime.Hour + 1;
                        ms += 60000;
                    }
                    else
                    {
                        h = dateTime.Hour;
                    }

                    if (h >= 24)
                    {
                        d = dateTime.Day + 1;
                    }
                    else if (h >= 12)
                    {
                        d   = dateTime.Day + 1;
                        ms += 3600000;
                    }
                    else
                    {
                        d = dateTime.Day;
                    }

                    daysInMonth = DateTime.DaysInMonth(dateTime.Year, dateTime.Month);
                    if (d >= daysInMonth / 2)
                    {
                        mm = dateTime.Month + 1;
                    }
                    else
                    {
                        mm = dateTime.Month;
                    }

                    if (mm >= 6)
                    {
                        return(new DateTime(dateTime.Year + 1, 1, 1, 0, 0, 0, 0, dateTime.Kind));
                    }
                    else
                    {
                        return(new DateTime(dateTime.Year, 1, 1, 0, 0, 0, 0, dateTime.Kind));
                    }
                    #endregion

                default: throw new NotSupportedException();
                }

            default: throw new NotSupportedException();
            }
        }
Пример #2
0
 /// <summary>
 /// Rounds the specified date time.
 /// </summary>
 /// <param name="dateTime">The date time.</param>
 /// <param name="dateTimeRoundingAccuracy">The date time rounding accuracy.</param>
 /// <returns></returns>
 public static DateTime Round(this DateTime dateTime, DateTimeRoundingAccuracy dateTimeRoundingAccuracy)
 {
     return(Round(dateTime, dateTimeRoundingAccuracy, MidpointRounding.AwayFromZero));
 }