Щелкните правой кнопкой мыши пакет на панели проекта.
Выберите Refactor -> Rename из контекстного меню.
Я usally использую TimeSpan. Методы FromXXX, чтобы сделать что-то вроде этого:
if((myDate - myOtherDate) > TimeSpan.FromSeconds(10))
{
//Do something here
}
Как насчет дополнительного метода для 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
}
у меня есть несколько модульных тестов, но это было бы немного слишком много кода для вставки здесь.
if (Math.Abs(dt1.Subtract(dt2).TotalSeconds) < 1.0)
По умолчанию C# сравнивает объекты DateTime с миллисекундой.
На самом деле разрешение к галочке на 100 нс.
, Если Вы сравниваете два значения DateTime от базы данных, которые имеют 1 разрешение с, без проблем.
, Если Вы соответствуете DateTime из другого источника (например, текущее использование DateTime DateTime. Теперь)), тогда необходимо решить, как Вы хотите, чтобы части секунды рассматривались. Например, округленный к самому близкому или усеченному? Как к раунду, если это - точно половина секунды.
я предлагаю Вас вокруг или усеченный к целому числу секунд, затем соответствую значению от базы данных. Вот сообщение, которое описывает, как к раунду DateTime (этот пример раунды к минутам, но принципал является тем же).
Необходимо удалить компонент миллисекунд из объекта даты. Один путь:
DateTime d = DateTime.Now;
d.Subtract(new TimeSpan(0, 0, 0, 0, d.Millisecond));
можно также вычесть два datetimes
d. Вычтите (DateTime. Теперь);
Это возвратит объект промежутка, который можно использовать для сравнения дней, часов, минут и компонентов секунд для наблюдения различия.