关于定时器修改系统时间的问题

时间:2021-12-12 02:37:23
我有一个定时任务处理程序,用户会从界面填写一个开始时间,某年某月某个时间点到某年某月某日期间执行某个任务,然后有个 任务开始时期和执行时间间隔(间隔N周,或N月,或N天)。

问题:
我目前计算第一次运行时间是采用的取系统时间计算的,但是这样用户一旦更改了系统时间,这个 第 一次运行时间就失效了
请问各位大侠,这种问题一般是怎么处理的?
我想了一下,1、是否有 更改系统时间的通知?2、有人说用::GetTickCount(),这种我没想出具体的方案。
求教,谢谢!

11 个解决方案

#1


第一种,获取网络时间,
第二种,将上次执行时间用文件记录下来,可以防止用户向前修改时间,至于防止用户向后修改时间,就不能保证了

#2


用个线程每隔一秒去取一下系统时间,然后比较下上一次取的时间,如果2个时间的误差超过可接受的范围(比如2秒,自己设置),那么就可以知道是不是被改过时间了,当然这需要在程序的执行期间才行

#3


用组策略设置不允许修改电脑时间。

#4


引用 3 楼 zhao4zhong1 的回复:
用组策略设置不允许修改电脑时间。

楼上大侠的意思是说这种程序修改系统时间后没有比较好的方案吗?

#5


引用 4 楼 happyhappymeme 的回复:
Quote: 引用 3 楼 zhao4zhong1 的回复:

用组策略设置不允许修改电脑时间。

楼上大侠的意思是说这种程序修改系统时间后没有比较好的方案吗?

Yes.Of cause.Why not.Certainly! 关于定时器修改系统时间的问题

#6


起个定时器
遍历计划, 与系统时间比较, 
如果(系统时间>下次执行时间)
    则修改下次执行时间.

#7


能不能  在 CMOS 中 找个 空 单元 写 上 设定 时间 

#8


第一次获取系统时间,管他是对的还是错误的。但同时用 GetTickCount 获取开机后的毫秒数。下次直接 GetTickCount 获取该值,与上次获取的值进行对比。即可知道过去了多少毫秒,然后可以在系统时间的基础上直接加,就知道按照当时设置的时间开始到现在为止未修改的情况下应该是几点几分,这样期间修改也没影响。但如果后续 GetTickCount 的结果比上次要小,那么说明已经重启过了。

#9


各位大侠的意见对我都有启发,尤其SXJIAKE和zhao4zhong1,最后决定还是先不考虑这种情况,结贴。

#10


结合 获取硬件 或是 系统  的运行  时间长度 

#11


系统时间更改,可以收到 WM_TIMECHANGE 消息。

#1


第一种,获取网络时间,
第二种,将上次执行时间用文件记录下来,可以防止用户向前修改时间,至于防止用户向后修改时间,就不能保证了

#2


用个线程每隔一秒去取一下系统时间,然后比较下上一次取的时间,如果2个时间的误差超过可接受的范围(比如2秒,自己设置),那么就可以知道是不是被改过时间了,当然这需要在程序的执行期间才行

#3


用组策略设置不允许修改电脑时间。

#4


引用 3 楼 zhao4zhong1 的回复:
用组策略设置不允许修改电脑时间。

楼上大侠的意思是说这种程序修改系统时间后没有比较好的方案吗?

#5


引用 4 楼 happyhappymeme 的回复:
Quote: 引用 3 楼 zhao4zhong1 的回复:

用组策略设置不允许修改电脑时间。

楼上大侠的意思是说这种程序修改系统时间后没有比较好的方案吗?

Yes.Of cause.Why not.Certainly! 关于定时器修改系统时间的问题

#6


起个定时器
遍历计划, 与系统时间比较, 
如果(系统时间>下次执行时间)
    则修改下次执行时间.

#7


能不能  在 CMOS 中 找个 空 单元 写 上 设定 时间 

#8


第一次获取系统时间,管他是对的还是错误的。但同时用 GetTickCount 获取开机后的毫秒数。下次直接 GetTickCount 获取该值,与上次获取的值进行对比。即可知道过去了多少毫秒,然后可以在系统时间的基础上直接加,就知道按照当时设置的时间开始到现在为止未修改的情况下应该是几点几分,这样期间修改也没影响。但如果后续 GetTickCount 的结果比上次要小,那么说明已经重启过了。

#9


各位大侠的意见对我都有启发,尤其SXJIAKE和zhao4zhong1,最后决定还是先不考虑这种情况,结贴。

#10


结合 获取硬件 或是 系统  的运行  时间长度 

#11


系统时间更改,可以收到 WM_TIMECHANGE 消息。