Точность сравнения DateTime

Я делаю сравнение DateTime, но я не хочу делать сравнение во втором, миллисекунде и уровне галочек. Каков самый изящный путь?

Если я просто сравниваю DateTime, то они редко равны из-за различий в галочках.

27
задан akif 2 June 2010 в 10:22
поделиться

5 ответов

А как насчет использования временного интервала.

if (Math.Truncate((A - B).TotalMinutes) == 0)
{
    //There is less than one minute between them
}

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

Правка : мне пришло в голову, что усечение не нужно ...

if (Math.Abs((A - B).TotalMinutes) < 1)
{
    //There is less than one minute between them
}

Лично я думаю, что это более элегантно ...

30
ответ дан 28 November 2019 в 04:52
поделиться

Вы можете преобразовать их в формат String и сравнить строки друг с другом.

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

if (String.Format("{0:ddMMyyyyHHmmss}", date1) == String.Format("{0:ddMMyyyyHHmmss}", date2))
{
     // success
}
4
ответ дан 28 November 2019 в 04:52
поделиться

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

DateTime compare1 = new DateTime(year1, month1, day1, hour1, minute1, 0);
DateTime compare2 = new DateTime(year2, month2, day2, hour2, minute2, 0);

int result = DateTime.Compare(compare1, compare2);

Я был бы первым, кто Признаюсь, это не изящно, но решает проблему.

8
ответ дан 28 November 2019 в 04:52
поделиться

Как насчет этого класса ComparerClass?

public class DateTimeComparer : Comparer<DateTime>
{
    private string _Format;

    public DateTimeComparer(string format)
    {
        _Format = format;
    }

    public override int Compare(DateTime x, DateTime y)
    {
        if(x.ToString(_Format) == y.ToString(_Format))
            return 0;

        return x.CompareTo(y);
    }
}

Его можно использовать

List.Sort(new DateTimeComparer("hh:mm"));
3
ответ дан 28 November 2019 в 04:52
поделиться

Используя TimeSpan, вы получаете всю необходимую вам детализацию :

DateTime dt1, dt2;
double d = (dt2 - dt1).TotalDays;
double h = (dt2 - dt1).TotalHours;
double m = (dt2 - dt1).TotalMinutes;
double s = (dt2 - dt1).TotalSeconds;
double ms = (dt2 - dt1).TotalMilliseconds;
double ticks = (dt2 - dt1).Ticks;
8
ответ дан 28 November 2019 в 04:52
поделиться
Другие вопросы по тегам:

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