有没有办法在c#中获取日期变更通知?
我有一个要求,即在系统日期发生变化时我必须做些什么。
我发现SystemsEvent.TimeChanged是您可以挂钩的事件,但只有在用户更改时间时才会触发它。
答案 0 :(得分:6)
通过在午夜运行计划的任务/计算机作业,可以更好地处理这个问题吗?
答案 1 :(得分:2)
你可以按照以下方式实现这一点(不可否认):
编写一个非常轻量级的类,它只存储当前日期。在一个单独的线程中启动它,并定期检查日期,然后睡眠很长时间(事实上,你可以让它睡眠的时间比离开午夜的时间长)。如果日期已更改,请在应用程序的主要部分调用回调函数。
就像我说的,这对你的问题来说似乎不是一个很好的解决方案,而且可能有更好的方法。
答案 2 :(得分:2)
您可能正在寻找System.Threading.Timer。它会以你设定的间隔开火。
答案 3 :(得分:2)
当用户更改系统日期/时间时,系统会广播WM_TIMECHANGE message。处理此问题的正确方法是处理该消息。我怀疑.net事件SystemEvents.TimeChanged只是一个包装器。
答案 4 :(得分:1)
假设您要求的是知道用户何时更改其PC的日期\时间,我知道这样做的唯一方法是监控EventLog,如下所示:
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 :(得分:0)
您的应用可以运行一个休眠一分钟的循环,然后检查日期。如果它与上次不同,请运行您的逻辑。
但我同意使用计划任务可以更好地处理这种情况。
答案 6 :(得分:0)
不确定是否有这样的事件,但如果没有,一个可用的解决方法是每分钟触发一个计时器,如果在两次通话之间的时间变化超过5分钟,那么你可以非常确定时间已经以某种方式改变了。如果你愿意的话,你可以通过每秒触发一次事件并检查超过10秒的时间差来获得更好的粒度,但每分钟可能就足够了。
答案 7 :(得分:0)
或者将其用于DST信息: TimeZone.CurrentTimeZone.GetDaylightChanges(DateTime.Today.Year)