关于DateTime自带的AddSeconds等函数的坑

在此记录一下今天在写一个进程查杀小程序时碰到的关于DateTime的问题:

 第一次是用AddSeconds后的时间直接和DateTime.Now做相等判断。

 1    class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Program pg = new Program();
 6             pg.NextRunTime = DateTime.Now.AddSeconds(2);
 7             while (true)
 8             {
 9                 if (DateTime.Now == pg.NextRunTime)
10                 {
11                     Thread.Sleep(500);
12                     pg.KillPro();
13                     pg.NextRunTime = DateTime.Now.AddSeconds(5);
14                 }
15             }
16         }
17 
18         private void KillPro()
19         {
20             int count = 0;
21             foreach (Process p in Process.GetProcesses())
22             {
23                 count++;
24                 //if (p.ProcessName == "werfault.exe")
25                 //{
26                 //    p.Kill();
27                 //}
28                 if (p.ProcessName == "RemotingServerConsoleContainer")
29                 {
30                     Console.WriteLine(p.ProcessName+"get killed");
31                     p.Kill();
32                     count = 0;
33                 }
34             }
35             if (count != 0)
36             {
37                 Console.WriteLine("RemotingServerConsoleContainer is not running");
38             }
39         }
40 
41         private DateTime nextRunTime;
42 
43         public DateTime NextRunTime
44         {
45             get;
46             set;
47         }
48     }
时间格式直接相等判断

想通过比较本次执行时间和下次执行时间来判断,是否执行程序。结果走不到if判断里。

后来查到DateTime的相等判断不能用==,应该用DateTime.Compare(瞬间觉得自己好low),CompareTo方法,

 1  public static void Main()
 2         { 
 3             DateTime t1 = DateTime.Now.AddSeconds(3.0);
 4             while (true)
 5             {
 6                 if (t1.CompareTo(DateTime.Now) == 0)
 7                 {
 8                     Thread.Sleep(500);
 9                     Console.WriteLine("111");
10                     t1 = DateTime.Now.AddSeconds(3.0);
11                 }
12                 if (t1.ToString() == DateTime.Now.ToString())
13                 {
14                     Thread.Sleep(500);
15                     Console.WriteLine("222");
16                     t1 = DateTime.Now.AddSeconds(3.0);
17                 }
18             }
19         }
第二次想当然的CompareTo

结果程序运行,只打印出“222”;

那也就是,第一个判断不相等了(废话),再仔细看AddSeconds()函数,是加的double类型的,想到了double类型的坑,你加的3可能不是真正的3,用下面两行代码做检验

DateTime t1 = DateTime.Now.AddSeconds(3.0f);
Console.WriteLine((t1 - DateTime.Now));

结果不用多说了,如图

总结:

1、使用方法时,注意方法参数,如果你正好碰到这个是浮点型的参数类型,恭喜你,你要注意浮点型不像整形的是所见即所得,而是给你四舍五入的结果。

2、判断日期格式相等的话,可以转为ToString()来判断;当然还有其他更好的方法,具体情况具体分析。

3、自己对属性的使用还不是真正的吃透,反思下自己的技术基础功底。老老实实看点文章,多敲代码,多思考。

 

posted @ 2018-05-04 16:06  尘世书童  阅读(5168)  评论(0编辑  收藏  举报