c # - значения времени округления до ближайшей четверти часа

У кого-нибудь есть хороший способ округлить вниз число от 0 до 59 до ближайшего 15. Я использую C # 3.5.

Итак ...

  • 1 будет 0
  • 29 будет 15
  • 30 будет 30

и т. Д. И т. Д.

Большое спасибо.

9
задан Peanut 19 February 2010 в 00:02
поделиться

6 ответов

x = x - (x % 15) было бы решением, которое не опирается на целочисленное деление.

25
ответ дан 4 December 2019 в 06:05
поделиться

В качестве метода расширения для datetime

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
11
ответ дан 4 December 2019 в 06:05
поделиться

Не могли бы вы использовать запрос формы:

SELECT your columns FROM your live table
EXCEPT
SELECT your columns FROM your archive table WHERE archive date is most recent;

Все результаты будут строками в живой таблице, которые отсутствуют в последнем архиве.

Если вам также нужны строки в вашем последнем архиве, которые не находятся в вашей живой таблице, просто измените порядок выбора и повторите, или получите их все в одном запросе, выполнив (live UNION archive) ЗА ИСКЛЮЧЕНИЕМ (live INTERSECTION archive)

-121--4213386-

Я успешно использовал следующий проект с открытым исходным кодом для реализации образца MVP в ASP.NET + WinForms + C #:

  • Castle Project.

Посмотрите на мою запись в блоге, в которой показан полный образец ASP.NET Web Приложения:

Модель просмотра шаблона докладчика с Castle в ASP.NET

-121--3780751-

Как насчет (x/15) * 15?

5
ответ дан 4 December 2019 в 06:05
поделиться

Я не знаю библиотечного вызова для этого (например, .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
ответ дан 4 December 2019 в 06:05
поделиться

Вы можете использовать целочисленное деление -

int number = 43;
int newNumber = number / 15;
int rounded = newNumber * 15;
3
ответ дан 4 December 2019 в 06:05
поделиться

Вот где оператор modulus оказывается очень кстати

number - (number % 15)
0
ответ дан 4 December 2019 в 06:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: