难以比较DateTimes的差异

时间:2013-11-30 15:37:33

标签: c# winforms datetime comparison

我有一个名为“lastActivated”的DateTime变量,当Form_Activated事件触发时,该变量设置为DateTime.Now。目标是确保在用户从另一个屏幕点击屏幕的前1秒内不会发生某些事情。

    DateTime? lastActivate = null; //used to determine the last time the screen was focused. 
    private void Form1_Activated(object sender, EventArgs e)
    {
        lastActivate = DateTime.Now;
    }

确定它是否超过1秒的代码看起来像

    TimeSpan oneSec = new TimeSpan(0,0,1);

    if (lastActivate == null || (TimeSpan)(lastActivate - DateTime.Now) > oneSec)
    {
        //stuff
    }

上面的if语句总是,总是失败。即使值是:

    lastActivate    {11/30/2013 10:23:21 AM}    System.DateTime?
    now {11/30/2013 10:32:48 AM}    System.DateTime

(我现在制作一个临时值DateTime = DateTime.Now所以我可以在这里粘贴这个值,因为我无法直接访问DateTime.Now的值)

有没有人对我做错了什么有任何建议,我应该改变什么来实现我追求的目标?

谢谢!

3 个答案:

答案 0 :(得分:4)

您可以通过以下方式测试两个日期之间的时间:

var lastActivated = DateTime.Now;

if (DateTime.Now.Subtract(lastActivated).TotalSeconds > 1)
{
    // Do whatever you need.
}

DateTime.Subtract(DateTime)返回两个给定日期之间时差的TimeSpan。

答案 1 :(得分:3)

上次有效日期小于当前时间,您应该从当前时间减去它:

if (!lastActivate.HasValue || (DateTime.Now - lastActivate.Value).TotalSeconds > 1)
{
    //stuff
}

答案 2 :(得分:2)

问题:您正在以相反的顺序减去,您应该subtract当前时间lastActivate的{​​{1}}时间。{
否则,当您从DateTime.Now中减去-ve时,您将始终获得DateTime.Now值,因为lastActivate时间始终小于当前时间lastActivate

解决方案:

此:

(DateTime.Now)

应该是:

(TimeSpan)(lastActivate - DateTime.Now)

完整代码:

(TimeSpan)(DateTime.Now - lastActivate)