关于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 }
结果程序运行,只打印出“222”;
那也就是,第一个判断不相等了(废话),再仔细看AddSeconds()函数,是加的double类型的,想到了double类型的坑,你加的3可能不是真正的3,用下面两行代码做检验
DateTime t1 = DateTime.Now.AddSeconds(3.0f); Console.WriteLine((t1 - DateTime.Now));
结果不用多说了,如图
总结:
1、使用方法时,注意方法参数,如果你正好碰到这个是浮点型的参数类型,恭喜你,你要注意浮点型不像整形的是所见即所得,而是给你四舍五入的结果。
2、判断日期格式相等的话,可以转为ToString()来判断;当然还有其他更好的方法,具体情况具体分析。
3、自己对属性的使用还不是真正的吃透,反思下自己的技术基础功底。老老实实看点文章,多敲代码,多思考。