有没有一种方法可以在C#中获取日期更改的通知?

9

有没有一种方法可以在C#中获得日期更改的通知?

我有一个要求,当系统日期更改时,我必须执行某些操作。

我发现SystemsEvent.TimeChanged是您可以连接到的事件,但仅在用户更改时间时才会触发它。


你应该描述你想要实现什么,或者你所说的系统日期更改的含义。所有的答案都在猜测你真正的问题是什么。 - Darryl Braaten
8个回答

6

这个问题是否可以通过设置定时任务/计划任务,在午夜运行来更好地处理?


2
您可以实现一个(尽管不太好的)方案,如下所示:
编写一个非常轻量级的类,它简单地存储当前日期。在一个单独的线程中启动它,并定期检查日期,然后休眠一段较长的时间(事实上,您可以使其休眠的时间略长于距离午夜的剩余时间)。如果日期发生了变化,使其在应用程序的主要部分调用回调函数。
就像我说的那样,这似乎不是解决您的问题的绝佳选择,可能还有更好的方法来解决它。

真的没有必要在这件事上浪费一个线程。按照Darryl Braaten的建议添加回调函数即可。回调函数由线程池线程执行,因此您不需要为此保留线程。 - Brian Rasmussen

2

2
系统在用户更改系统日期/时间时广播WM_TIMECHANGE消息。正确的处理方法是处理该消息。我怀疑.net事件SystemEvents.TimeChanged只是这个消息的一个包装器。

发生了一些奇怪的事情:当日期从14(例如)更改为13时,事件触发一次。当日期改回14时,没有触发任何事件。 - Syed Irfan Ahmad

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");
    }

0
你的应用程序可以运行一个休眠一分钟的循环,然后检查日期。如果与上次不同,就运行你的逻辑。
但我同意这种情况最好使用定时任务来处理。

0

不确定是否有此类事件,但如果没有,可使用的解决方法是每分钟触发一个计时器,如果两次调用之间的时间差超过5分钟,则可以相当确定时间已经以某种方式被更改。如果您愿意,可以更细粒度地进行操作,每秒触发一次事件,并检查时间差异,如果超过10秒,则可能会更好,但每分钟可能已经足够。


0

或者可以使用以下方法获取DST信息: TimeZone.CurrentTimeZone.GetDaylightChanges(DateTime.Today.Year)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接