關於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、自己對屬性的使用還不是真正的吃透,反思下自己的技術基礎功底。老老實實看點文章,多敲代碼,多思考。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM