zoukankan      html  css  js  c++  java
  • 关于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、自己对属性的使用还不是真正的吃透,反思下自己的技术基础功底。老老实实看点文章,多敲代码,多思考。

  • 相关阅读:
    【模板小程序】链表排序(qsort/insert_sort/merge_sort)
    链表回文判断(C++)
    【模板小程序】十进制大数除法(输出商和余数)
    【模板小程序】字符串截取
    【模板小程序】翻转一个句子中的单词
    web前端基础背景
    MongoDB基本知识(补充)
    Python-ORM
    Python-元编程
    ElementUI 中 el-table 获取当前选中行的index
  • 原文地址:https://www.cnblogs.com/meng9527/p/8990799.html
Copyright © 2011-2022 走看看