关于DateTime自带的AddSeconds等函数的坑
在此记录一下今天在写一个进程查杀小程序时碰到的关于DateTime的问题:
第一次是用AddSeconds后的时间直接和DateTime.Now做相等判断。
class Program
{
static void Main(string[] args)
{
Program pg = new Program();
pg.NextRunTime = DateTime.Now.AddSeconds();
while (true)
{
if (DateTime.Now == pg.NextRunTime)
{
Thread.Sleep();
pg.KillPro();
pg.NextRunTime = DateTime.Now.AddSeconds();
}
}
} private void KillPro()
{
int count = ;
foreach (Process p in Process.GetProcesses())
{
count++;
//if (p.ProcessName == "werfault.exe")
//{
// p.Kill();
//}
if (p.ProcessName == "RemotingServerConsoleContainer")
{
Console.WriteLine(p.ProcessName+"get killed");
p.Kill();
count = ;
}
}
if (count != )
{
Console.WriteLine("RemotingServerConsoleContainer is not running");
}
} private DateTime nextRunTime; public DateTime NextRunTime
{
get;
set;
}
}
时间格式直接相等判断
想通过比较本次执行时间和下次执行时间来判断,是否执行程序。结果走不到if判断里。
后来查到DateTime的相等判断不能用==,应该用DateTime.Compare(瞬间觉得自己好low),CompareTo方法,
public static void Main()
{
DateTime t1 = DateTime.Now.AddSeconds(3.0);
while (true)
{
if (t1.CompareTo(DateTime.Now) == )
{
Thread.Sleep();
Console.WriteLine("");
t1 = DateTime.Now.AddSeconds(3.0);
}
if (t1.ToString() == DateTime.Now.ToString())
{
Thread.Sleep();
Console.WriteLine("");
t1 = DateTime.Now.AddSeconds(3.0);
}
}
}
第二次想当然的CompareTo
结果程序运行,只打印出“222”;
那也就是,第一个判断不相等了(废话),再仔细看AddSeconds()函数,是加的double类型的,想到了double类型的坑,你加的3可能不是真正的3,用下面两行代码做检验
DateTime t1 = DateTime.Now.AddSeconds(3.0f);
Console.WriteLine((t1 - DateTime.Now));
结果不用多说了,如图

总结:
1、使用方法时,注意方法参数,如果你正好碰到这个是浮点型的参数类型,恭喜你,你要注意浮点型不像整形的是所见即所得,而是给你四舍五入的结果。
2、判断日期格式相等的话,可以转为ToString()来判断;当然还有其他更好的方法,具体情况具体分析。
3、自己对属性的使用还不是真正的吃透,反思下自己的技术基础功底。老老实实看点文章,多敲代码,多思考。
关于DateTime自带的AddSeconds等函数的坑的更多相关文章
- C/C++ 不带参数的回调函数 与 带参数的回调函数 函数指针数组 例子
先来不带参数的回调函数例子 #include <iostream> #include <windows.h> void printFunc() { std::cout<& ...
- C语言带参数的main函数
C语言带参数的main函数 #include<stdio.h> int main(int argc,char*argv[]) { int i; ;i<argc;i++) printf ...
- C++——带默认参数值的函数
函数在声明时可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采用预先给出的默认参数值. ,) { return x + y;} int main() { add(,);//10+20 a ...
- emwin之在WM_INIT_DIALOG分支下使用带触发功能的函数的程序框架
@2018-08-29 [小记] 为避免在窗口创建时由于使用了带触发功能的函数导致执行一些在初始化过程中不允许的操作,特整理一个流程架构 --① 定义一个初始化完成的标志 unsigned ; --② ...
- C/C++中带可变参数的函数
1.带可变参数的函数由来 当函数中的参数个数不确定时,这时候就需要带可变参数的函数! 如我们经常使用的C库函数printf()实际就是一个可变参数的函数, 其原型为: int printf( cons ...
- 改造phpcms-v9自带的字符串截取函数
1.phpcms-v9自带的字符串截取函数在phpcms/libs/functions/global.func.php文件中: /** * 字符截取 支持UTF8/GBK * @param $stri ...
- Delphi 自带的字符串分割函数split
下面介绍Delphi自带的字符串分割函数,根据你的需要来使用. 1.ExtractStrings function ExtractStrings(Separators, WhiteSpace: TSy ...
- 【c++】类中带默认参数的函数
反思两个问题 1. 带默认参数的函数,为何声明.定义不能同时有参数? 2. 带默认参数的函数, 为何带默认参数的参数靠后站? 上程序 #include <iostream> #includ ...
- 介绍几个PHP 自带的加密解密函数
PHP 自带的加密解密函数 目前经常使用的加密函数有:md5(), sha1(), crypt(), base64_encode(), urlencode() . 其中 md5(), sha1(), ...
随机推荐
- 7、JPA-映射-双向一对多
一个用户对应多个订单,多个订单对应一个用户,不管查哪一边都可以得到另一边的信息 实体类 Customer package com.jpa.yingshe; import javax.persisten ...
- python mysql索引 优化神器explain 慢查询
##############总结########## 数据库中专门帮助用户快速找到数据的一种数据结构 类似于字典的目录的索引 索引的作用:约束和加速查找 工作原理: b+树形结构 最上层是树根,中间是 ...
- Nginx 简单安装
关于nginx的介绍:http://baike.baidu.com/link?url=UZjpP8y4MUgrjqACfxd7c3Cm4L8PnJsKkxSJQ3CrRcKZUjkkl4zGNs6Pr ...
- go结构体方法
Golang中的方法是作用在特定类型的变量上,因此自定义类型,都可以有方法,而不仅仅是struct. 定义格式 func (var *Struct_Name) FuncName( var0, var1 ...
- jQuery使用(三):DOM操作之val()方法操作表单元素value值
操作表单元素属性value的值 <form action="./" method='GET'> <h3 >选择你喜欢的明星</h3> <s ...
- mongoDB与mongoose
mongodb是一个基于分布式文件存储的文档型数据库 MongoDB 是一个介于关系数据库和非关系数据库之间的产品 MongoDB 最大的特点是他支持的查询语言非常强大,而且还支持对数据建立索引 官方 ...
- vue-if与vue-show的区别
两者都是动态显示DOM元素 不同点: 1.使用方式 v-if是根据后面数据的真假,来判断DOM的添加删除等操作 v-show只是在修改元素的css样式(display属性值) 2.实现过程 v ...
- html中src与href的区别
概述 src和href之间存在区别,能混淆使用.src用于替换当前元素,href用于在当前文档和引用资源之间确立联系. src src是source的缩写,指向外部资源的位置,指向的内容将会嵌入到文档 ...
- [译]A NON-TRIVIAL EXAMPLE OF MEDIATR USAGE
原文 来看看我目前的一个项目.这个是一个多租户的财务跟踪系统.有一个组织继承的关系.首先得新建一个组织. 表单如下: 这个表单能让用户输入关于组织的一些信息,包括active directory组,一 ...
- Javascript面向对象特性实现封装、继承、接口详细案例
Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...