【发布时间】:2008-12-16 19:02:44
【问题描述】:
有没有办法在 c# 中获取日期更改通知?
我有一个要求,当系统日期更改时我必须做一些事情。
我发现 SystemsEvent.TimeChanged 是一个可以挂钩的事件,但只有在用户更改时间时才会触发它。
【问题讨论】:
-
您应该描述您想要完成的任务和/或系统日期更改的含义。所有的答案都在猜测你真正的问题是什么。
有没有办法在 c# 中获取日期更改通知?
我有一个要求,当系统日期更改时我必须做一些事情。
我发现 SystemsEvent.TimeChanged 是一个可以挂钩的事件,但只有在用户更改时间时才会触发它。
【问题讨论】:
安排一个在午夜运行的计划任务/cron 作业会更好地处理这个问题吗?
【讨论】:
您可以按如下方式实现(当然很糟糕):
编写一个非常轻量级的类,它只存储当前日期。在一个单独的线程中启动它并让它定期检查日期,然后休眠很长一段时间(事实上,你可以让它休眠的时间比午夜之前的时间长)。如果日期已更改,请使其在应用的主要部分中调用回调函数。
就像我说的,这似乎不是解决您的问题的绝妙方法,可能还有更好的方法。
【讨论】:
您可能正在寻找System.Threading.Timer。它将以您设置的时间间隔触发。
【讨论】:
当用户更改系统日期/时间时,系统会广播WM_TIMECHANGE message。处理此问题的正确方法是处理该消息。我怀疑.net 事件 SystemEvents.TimeChanged 只是对此的一个包装。
【讨论】:
假设您要知道用户何时更改其 PC 的日期\时间,我知道这样做的唯一方法是监视事件日志,如下所示:
static System.Diagnostics.EventLog log = new EventLog("System");
public Form1()
{
log.EntryWritten += new EntryWrittenEventHandler(log_EntryWritten);
log.EnableRaisingEvents = true;
}
void log_EntryWritten(object sender, EntryWrittenEventArgs e)
{
if (e.Entry.InstanceId == 1 && e.Entry.EntryType == EventLogEntryType.Information)
Console.WriteLine("Test");
}
【讨论】:
您的应用可能会运行一个休眠一分钟的循环,然后检查日期。如果与上次不同,请运行您的逻辑。
但我同意使用计划任务更好地处理这种情况。
【讨论】:
不确定是否有此事件,但如果没有,可用的解决方法是每分钟触发一次计时器,如果两次调用之间的时间变化超过 5 分钟,那么您可以确定时间已经以某种方式改变了。如果您愿意,可以通过每秒触发一次事件并检查超过 10 秒的时间差来进行更精细的处理,但每分钟可能就足够了。
【讨论】:
或将其用于 DST 信息: TimeZone.CurrentTimeZone.GetDaylightChanges(DateTime.Today.Year)
【讨论】: