Как сравнить две даты - PullRequest
       40

Как сравнить две даты

5 голосов
/ 16 октября 2010

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

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

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

Ответы [ 4 ]

9 голосов
/ 16 октября 2010

Вы можете вычесть одно 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 тик = 100 наносекунд = 10 ^ -7 секунд.
  • Значение больше 0, если d1 хронологически после d2 (d1 > d2)
  • Значение меньше 0, если d1 находится хронологически перед d2 (d1 < d2)
2 голосов
/ 16 октября 2010

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

2 голосов
/ 16 октября 2010

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

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

// For milliseconds
if (laterDate-earlierDate<=TimeSpan.FromMilliseconds(1))
  ...
2 голосов
/ 16 октября 2010

Используйте 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);
...