DateTime Round Up和Down

par*_*ent 14 .net c# datetime rounding

我一直在寻找一个合适的舍入机制,但我找不到似乎正是我需要的东西.

我需要分别向上和向下舍入,我还需要考虑到已经四舍五入的情况.

我需要进行以下四舍五入

5:00 -> RoundDown() -> 5:00
5:04 -> RoundDown() -> 5:00
5:09 -> RoundDown() -> 5:00
5:10 -> RoundDown() -> 5:10

4:00 -> RoundUp() -> 4:00
4:50 -> RoundUp() -> 4:50
4:51 -> RoundUp() -> 5:00
4:56 -> RoundUp() -> 5:00 
Run Code Online (Sandbox Code Playgroud)

基本上我需要将RoundUp()或RoundDown()显式地提交到最近的10分钟,但如果它已经是10分钟的倍数,它也应该保持时间不变.此外,我想截断它们对舍入过程没有影响的任何秒数

4:50:45 - > 4:50:00 - > RoundUp() - > 4:50

有没有人有任何方便的代码来实现这一目标.

我在某个地方找到了这个代码,但是它在5:00 - > RoundUp() - > 5:10之后发现,而不是保持完整,因为它已经是10的倍数而不需要舍入.我也不确定秒会影响它

public static DateTime RoundDateTime(this 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));
}
Run Code Online (Sandbox Code Playgroud)

希望有人可以编辑该方法,使其适合我.谢谢

aj.*_*lan 36

这将允许您根据给定的任何间隔进行舍入.

public static class DateTimeExtensions
{
  public static DateTime Floor(this DateTime dateTime, TimeSpan interval)
  {
    return dateTime.AddTicks(-(dateTime.Ticks % interval.Ticks));
  }

  public static DateTime Ceiling(this DateTime dateTime, TimeSpan interval)
  {
    var overflow = dateTime.Ticks % interval.Ticks;

    return overflow == 0 ? dateTime : dateTime.AddTicks(interval.Ticks - overflow);
  }

  public static DateTime Round(this DateTime dateTime, TimeSpan interval)
  {
    var halfIntervalTicks = (interval.Ticks + 1) >> 1;

    return dateTime.AddTicks(halfIntervalTicks - ((dateTime.Ticks + halfIntervalTicks) % interval.Ticks));
  }
}
Run Code Online (Sandbox Code Playgroud)

为了处理截断秒数,我只需从日期时间中减去秒和毫秒,然后再将它们发送到舍入函数.


mel*_*okb 13

怎么样:

case RoundingDirection.Up:
    t = dt.AddMinutes((60 - dt.Minute) % 10);
case RoundingDirection.Down:
    t = dt.AddMinutes(-dt.Minute % 10);
Run Code Online (Sandbox Code Playgroud)

演示:http://ideone.com/AlB7Q

  • 这会照顾秒吗? (2认同)