2010-10-16 2 views
5

Интересно, как сравнить два объекта DateTime в .NET с использованием методов DateTime Compare, CompareTo или Equals без сравнения тиков.Как сравнить два времени datetime

Мне нужен только уровень допуска в миллисекундах или секунды.

Как это можно сделать?

ответ

9

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

bool dtsWithinASecOfEachOther = d1.Subtract(d2).Duration() <= TimeSpan.FromSeconds(1); 

Вызов TimeSpan.Duration() может быть опущена, если вы знаете, что первый DateTime не может представлять более раннюю точку во времени, чем другие, то есть d1 >= d2.

Чтобы ответить на ваш запрос о методах сравнения, DateTime.Compare(d1, d2) дает тот же результат, как d1.CompareTo(d2):

  • 0, если они представляют собой один и тот же момент времени (d1.Equals(d2), d1 == d2). Обратите внимание, что разрешение DateTime равно 1 tick = 100 наносекунд = 10^-7 секунд.
  • значение больше 0, если d1 хронологически после d2 (d1 > d2)
  • значение меньше 0, если d1 хронологически перед тем d2 (d1 < d2)
2

Используйте TimeSpan для проверки допуска - TimeSpan является тип, возвращаемый вычитая DateTimes:

TimeSpan tolerance = new TimeSpan(0,0,1); 
return (date1 - date2) <= tolerance; 

Compare, CompareTo и Equals не будет брать допуск для сравнения, так не может использоваться таким образом.

Другие варианты для создания новых DateTime s от существующих, отбросив ненужную точность и сравнение новых:

DateTime noSeconds1 = new DateTime(d1.Year, d1.Month, d1.Day, d1.Hour, d1.Minute, 0); 
DateTime noSeconds2 = new DateTime(d2.Year, d2.Month, d2.Day, d2.Hour, d2.Minute, 0); 

noSeconds1.Equals(noSeconds2); 
DateTime.Compare(noSeconds1, noSeconds2); 
noSeconds1.CompareTo(noSeconds2); 
2

Вообще, если вы хотите один сравнить, чтобы сказать вам, какая дата меньше, равно или больше, используйте DateTime.Compare(). В противном случае вы можете использовать DateTime.Equals(). Чтобы добавить значение допуска, вычесть одно из другого и результат сравнения будет меньше некоторого TimeSpan:

// For seconds 
if (laterDate-earlierDate<=TimeSpan.FromSeconds(1)) 
    ... 

// For milliseconds 
if (laterDate-earlierDate<=TimeSpan.FromMilliseconds(1)) 
    ... 
2

Вы можете конвертировать как DateTimes в строку и сравнить получившиеся строки. Убедитесь, что вы определяете формат строки, чтобы избежать проблем на машинах с разными региональными настройками, чем ваши.