在此記錄一下今天在寫一個進程查殺小程序時碰到的關於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、自己對屬性的使用還不是真正的吃透,反思下自己的技術基礎功底。老老實實看點文章,多敲代碼,多思考。