DateTime Comparison Precision

后端 未结 10 526
攒了一身酷
攒了一身酷 2020-12-29 04:24

I\'m doing DateTime comparison but I don\'t want to do comparison at second, millisecond and ticks level. What\'s the most elegant way?

If I simply compare the DateT

相关标签:
10条回答
  • 2020-12-29 04:36

    Very simple solution from my own code:

    TimeSpan timeDifference = presentLastSavedDate.Subtract(previousLastSavedDate);
    if (timeDifference.Seconds > 0)
    {
        return Content(HttpStatusCode.Conflict, ALREADY_CHANGED_MSG);
    }
    
    0 讨论(0)
  • 2020-12-29 04:38

    Using a TimeSpan you get all the granularity you want :

    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;
    
    0 讨论(0)
  • 2020-12-29 04:41

    I've written this to help myself:

        internal class ImpreciseCompareDate : IComparer<DateTime>
    {
        private readonly double _Tolerance;
    
        public ImpreciseCompareDate(double MillisecondsTolerance)
        {
            _Tolerance = MillisecondsTolerance;
        }
    
        public int Compare(DateTime x, DateTime y)
        {
            return Math.Abs((x - y).TotalMilliseconds) < _Tolerance ? 0 : x.CompareTo(y);
        }
    }
    

    Tolerance can be set to (10d/3d) to account for SQL servers 1/300th of a ms. If tolerance is exceeded, delegate to default comparer.

    0 讨论(0)
  • 2020-12-29 04:44

    How about this 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);
        }
    }
    

    This can be used by

    List.Sort(new DateTimeComparer("hh:mm"));
    
    0 讨论(0)
  • 2020-12-29 04:46

    What about using a timespan.

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

    Probably not the most elegant way, but it allows for cases which are one second apart and yet have different days/hours/minutes parts such as going over midnight.

    Edit: it occured to me that the truncate is unecessary...

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

    Personally I think this is more elegant...

    0 讨论(0)
  • 2020-12-29 04:48

    One approach could be to create two new DateTimes from your values you want to compare, but ignore anything from the seconds on down and then compare those:

    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);
    

    I'd be the first to admit it's not elegant, but it solves the problem.

    0 讨论(0)
提交回复
热议问题