c# - 将时间值舍入到最接近的四分之一小时

时间:2010-02-19 00:02:47

标签: c# rounding

有没有人有一个好方法可以将向下一个0到59之间的数字四舍五入到最接近的15。 我正在使用C#3.5。

所以......

  • 1将为0
  • 29将是15
  • 30将是30

等等。

非常感谢。

6 个答案:

答案 0 :(得分:24)

x = x - (x % 15)将是一个不依赖于整数除法的解决方案。

答案 1 :(得分:10)

作为日期时间的扩展方法

public static DateTime RoundDown(this DateTime dateTime)
{
    return new DateTime(dateTime.Year, dateTime.Month, 
         dateTime.Day, dateTime.Hour, (dateTime.Minute / 15) * 15, 0);
}

使用

DateTime date = dateTime.Now.RoundDown();//for example

答案 2 :(得分:5)

(x / 15)* 15怎么样?

答案 3 :(得分:4)

我不知道这个库的调用(如.Round(...)),也许扩展方法很适合?

我会选择一个简单的IF语句。

如果速度是个问题,请为每个值尝试扩展的switch语句。如果这是一个问题,请使用单元测试来查看更新。

完成......

//...
[TestMethod]
    public void round_down()
    {
        Assert.AreEqual(-5.RoundDown(), 0);
        Assert.AreEqual(0.RoundDown(), 0);
        Assert.AreEqual(1.RoundDown(), 0);
        Assert.AreEqual(20.RoundDown(), 15);
        Assert.AreEqual(42.RoundDown(), 30);
        Assert.AreEqual(48.RoundDown(), 45);
        Assert.AreEqual(59.RoundDown(), 45);
        Assert.AreEqual(90.RoundDown(), 45);
    }

// ...

public static class Ext
{
    public static int RoundDown(this int val)
    {
        if (val < 0)
            return 0;
        if (val < 15)
            return 0;
        if (val < 30)
            return 15;
        if (val < 45)
            return 30;
        return 45;
    }
}

答案 4 :(得分:3)

您可以使用整数除法 -

int number = 43;
int newNumber = number / 15;
int rounded = newNumber * 15;

答案 5 :(得分:0)

这是模数运算符非常方便的地方

number - (number % 15)