在C#中,使用tick比较两个日期之间的区别是什么?

时间:2014-06-03 13:17:45

标签: c# .net datetime

我是C#的新手。我正在阅读一些代码,这些代码是在我遇到这个项目之前从事过我的项目的人写的:

if (olderTime.happenedWhen.Ticks > happenedWhen.Ticks)
{
   thisIsTrulyNew = false;
}

olderTime.happenedWhenhappenedWhen都属于DateTime类型。

这是比较DateTime更准确的方法吗?

我知道Ticks代表从0001年1月1日00:00开始的100纳秒间隔。但是为什么在我认为可以做的时候进行这种比较:

if (olderTime.happenedWhen > happenedWhen){
   thisIsTrulyNew = false
}

滴答比较是否达到了正常比较不会的效果?

5 个答案:

答案 0 :(得分:33)

  

这是比较DateTime更准确的方法吗?

没有丝毫。实际上,这就是>运算符在内部实现的方式。

来自the .NET Reference source

public static bool operator >(DateTime t1, DateTime t2) {
    return t1.InternalTicks > t2.InternalTicks;
}

有人可能认为他们通过跳过一行内部代码并直接进入Ticks属性而变得聪明。实际上,Ticks的getter返回InternalTicks,因此除非编译器对其进行优化,否则使用Ticks属性会添加两个调用以保存一个呼叫(两者都不会显着改变性能)。

答案 1 :(得分:18)

operator > DateTime的实现也比较了滴答,正如您从此反汇编代码中看到的那样(mscorlib.dll,System.DateTime类):

[__DynamicallyInvokable]
public long Ticks
{
    [__DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
    get
    {
        return this.InternalTicks;
    }
}

[__DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static bool operator >(DateTime t1, DateTime t2)
{
    return t1.InternalTicks > t2.InternalTicks;
}

答案 2 :(得分:3)

>运算符的实现如下:

public static bool operator >(DateTime t1, DateTime t2)
{
   return t1.InternalTicks > t2.InternalTicks;
}

所以它真的一样(Ticks返回InternalTicks)。

答案 3 :(得分:3)

source显示了这一点:

    public static bool operator >(DateTime t1, DateTime t2) {
        return t1.InternalTicks > t2.InternalTicks;
    }

哪个是

    internal Int64 InternalTicks {
        get {
            return (Int64)(dateData & TicksMask);
        }
    }

在构造函数中设置了dateData,只是引用dateData = (UInt64)ticks;TicksMask

private const UInt64 TicksMask = 0x3FFFFFFFFFFFFFFF;

答案 4 :(得分:2)

这是一回事。 从source code >运算符定义为:

public static bool operator >(DateTime t1, DateTime t2) 
{
      return t1.InternalTicks > t2.InternalTicks;
}

为了完整起见,Ticks属性定义为:

public long Ticks
{
        get 
        { 
            return InternalTicks; 
        }
}