/// <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(); } }
/// <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)); }