关于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(), ...
随机推荐
- nginx的下载、编译安装和启动
一.nginx简介 nginx(“engine x”)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器.nginx是由Igor Sysoev为俄罗斯访问量第二的R ...
- SpringBoot笔记十三:引入webjar资源和国际化处理
目录 什么是webjar 怎么使用webjar 国际化 新建国际化配置文件 配置配置文件 使用配置文件 我们先来看一个html,带有css的,我们就以这个为准来讲解. 资源可以去我网盘下载 链接:ht ...
- SQL Server日志过大,清理日志
直接执行下面的代码 USE [master] GO ALTER DATABASE 数据库 SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE 数据库 ...
- tomcat 下配置ajax 跨域 tomcat font face 跨域 java跨域
tomcat ajax跨域和css字体 font face 跨域一样适用 CORS介绍 它在维基百科上的定义是:跨域资源共享(CORS )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式 ...
- ACM-ICPC 2018 焦作赛区网络预赛 K Transport Ship (多重背包)
https://nanti.jisuanke.com/t/31720 题意 t组样例,n种船只,q个询问,接下来n行给你每种船只的信息:v[i]表示这个船只的载重,c[i]表示这种船只有2^(c[i] ...
- oldboy s21day04
#!/usr/bin/env python# -*- coding:utf-8 -*- # 1.简述解释型语言和编译型语言的区别?"""1.解释型语言:Python,PH ...
- tomcat配置context的crossContext属性应用案例
在tomcat下,context元素有一个crossContext属性,如果配置为true,则可以实现在同一个tomcat下的多个web应用之间实现ServletContext对象访问.该属性主要用于 ...
- Struts2的初级应用
做一个登录注册 1.把Struts2框架的必须包导入到项目中(http://struts.apache.org/) 2.web.xml <?xml version="1.0" ...
- HTTP访问控制(CORS)
当一个资源从与该资源本身所在的服务器不同的域或端口请求一个资源时,资源会发起一个跨域 HTTP 请求. 比如,站点 http://domain-a.com 的某 HTML 页面通过 <img ...
- springboot04-mongodb
1.搭建mongodb服务 在https://www.mongodb.com/下载mongodb安装包,解压到本地 cmd中执行命令,启动本地mongodb: cd D:\Program Files\ ...