Как Вы сравниваете объекты DateTime с помощью указанного допуска в C#?

Щелкните правой кнопкой мыши пакет на панели проекта.

Выберите Refactor -> Rename из контекстного меню.

28
задан dthrasher 19 December 2008 в 17:57
поделиться

5 ответов

Я usally использую TimeSpan. Методы FromXXX, чтобы сделать что-то вроде этого:

if((myDate - myOtherDate) > TimeSpan.FromSeconds(10))
{
   //Do something here
}
25
ответ дан Micah 14 October 2019 в 11:18
поделиться

Как насчет дополнительного метода для DateTime для создания чего-то вроде быстрого интерфейса (те - все право гнева?)

public static class DateTimeTolerance
{
    private static TimeSpan _defaultTolerance = TimeSpan.FromSeconds(10);
    public static void SetDefault(TimeSpan tolerance)
    {
        _defaultTolerance = tolerance;
    }

    public static DateTimeWithin Within(this DateTime dateTime, TimeSpan tolerance)
    {
        return new DateTimeWithin(dateTime, tolerance);
    }

    public static DateTimeWithin Within(this DateTime dateTime)
    {
        return new DateTimeWithin(dateTime, _defaultTolerance);
    }
}

Это полагается на класс, чтобы сохранить состояние и определить пару перегрузок оператора для == и! =:

public class DateTimeWithin
{
    public DateTimeWithin(DateTime dateTime, TimeSpan tolerance)
    {
        DateTime = dateTime;
        Tolerance = tolerance;
    }

    public TimeSpan Tolerance { get; private set; }
    public DateTime DateTime { get; private set; }

    public static bool operator ==(DateTime lhs, DateTimeWithin rhs)
    {
        return (lhs - rhs.DateTime).Duration() <= rhs.Tolerance;
    }

    public static bool operator !=(DateTime lhs, DateTimeWithin rhs)
    {
        return (lhs - rhs.DateTime).Duration() > rhs.Tolerance;
    }

    public static bool operator ==(DateTimeWithin lhs, DateTime rhs)
    {
        return rhs == lhs;
    }

    public static bool operator !=(DateTimeWithin lhs, DateTime rhs)
    {
        return rhs != lhs;
    }
}

Тогда в Вашем коде можно сделать:

DateTime d1 = DateTime.Now;
DateTime d2 = d1 + TimeSpan.FromSeconds(20);

if(d1 == d2.Within(TimeSpan.FromMinutes(1))) {
    // TRUE! Do whatever
}

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

DateTimeTolerance.SetDefault(TimeSpan.FromMinutes(1));

if(d1 == d2.Within()) {  // Uses default tolerance
    // TRUE! Do whatever
}

у меня есть несколько модульных тестов, но это было бы немного слишком много кода для вставки здесь.

10
ответ дан joshperry 14 October 2019 в 11:18
поделиться
        if (Math.Abs(dt1.Subtract(dt2).TotalSeconds) < 1.0)
2
ответ дан Charles Bretana 14 October 2019 в 11:18
поделиться

По умолчанию C# сравнивает объекты DateTime с миллисекундой.

На самом деле разрешение к галочке на 100 нс.

, Если Вы сравниваете два значения DateTime от базы данных, которые имеют 1 разрешение с, без проблем.

, Если Вы соответствуете DateTime из другого источника (например, текущее использование DateTime DateTime. Теперь)), тогда необходимо решить, как Вы хотите, чтобы части секунды рассматривались. Например, округленный к самому близкому или усеченному? Как к раунду, если это - точно половина секунды.

я предлагаю Вас вокруг или усеченный к целому числу секунд, затем соответствую значению от базы данных. Вот сообщение, которое описывает, как к раунду DateTime (этот пример раунды к минутам, но принципал является тем же).

1
ответ дан Community 14 October 2019 в 11:18
поделиться

Необходимо удалить компонент миллисекунд из объекта даты. Один путь:

    DateTime d = DateTime.Now;
    d.Subtract(new TimeSpan(0, 0, 0, 0, d.Millisecond));

можно также вычесть два datetimes

d. Вычтите (DateTime. Теперь);

Это возвратит объект промежутка, который можно использовать для сравнения дней, часов, минут и компонентов секунд для наблюдения различия.

5
ответ дан JoshBerke 14 October 2019 в 11:18
поделиться
Другие вопросы по тегам:

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