【问题标题】:Getting notified when the datetime changes in c#当 c# 中的日期时间更改时收到通知
【发布时间】:2008-11-17 10:11:27
【问题描述】:

最近我正在尝试制作一个日历应用程序,它将向用户显示当前的年月日。问题是,如果用户要让我的应用程序在第二天继续运行,我如何得到通知?如何更改显示的日期?我不想轮询当前日期来更新它。这在 c# 中是否可能。

注意:我尝试了 SystemEvent.TimeChanged 事件,但它只有在用户从控制面板手动更改时间/日期时才有效。

【问题讨论】:

    标签: c# events datetime systemevent


    【解决方案1】:

    @OddThinking 的答案将起作用(您可以为间隔设置一个计时器而不是睡眠)。另一种方法是设置一个间隔为 1 分钟的计时器,然后简单地检查系统日期是否已更改。由于您每分钟只执行一次轻量级代码,我怀疑开销会很明显。

    【讨论】:

      【解决方案2】:
      public void Main()
      {
      
          var T = new System.Timers.Timer();
      
          T.Elapsed += CallBackFunction;
      
          var D = (DateTime.Today.AddDays(1).Date - DateTime.Now);
      
          T.Interval = D.TotalMilliseconds;
      
          T.Start();
      
      }
      
      private void CallBackFunction(object sender, System.Timers.ElapsedEventArgs e)
      {
      
          (sender as System.Timers.Timer).Interval = (DateTime.Today.AddDays(1).Date - DateTime.Now).TotalMilliseconds;
      
      }
      

      【讨论】:

        【解决方案3】:

        你能简单地算出直到午夜的秒数,然后再睡那么久吗?

        【讨论】:

        • 好吧,某种计时器可能比 Sleep() 更可取 [这会清除你的 UI]
        • 简单的解决方案,但不要忘记夏令时!否则你会在你认为是午夜之后醒来,但实际上日期不会改变。
        • 我同意 Marc 的观点,定时器比睡觉更可取。我曾设想过一个单独的线程来处理这个问题,但这可能是矫枉过正。不过同样的想法。
        • 斑马先生说得好。当然,它是双向的 - 您可能会等待太久,然后将旧日期显示多一个小时。
        • 另外,用户可能会在中间更改时间(尽管您可能会单独处理此事件)
        【解决方案4】:

        尝试查看监控 WMI 事件,您应该能够创建一个 Wql 事件查询来监控星期几的变化(即 ManagementEventWatcher 等),然后设置一个在事件到达时触发的事件处理程序。

        使用系统; 使用 System.Management; 课堂节目 { 公共静态无效 Main() { WqlEventQuery q = 新 WqlEventQuery(); q.EventClassName = "__InstanceModificationEvent"; q.Condition = @"TargetInstance ISA 'Win32_LocalTime' AND TargetInstance.Hour = 22 AND TargetInstance.Minute = 7 AND TargetInstance.Second = 59"; Console.WriteLine(q.QueryString); 使用 (ManagementEventWatcher w = new ManagementEventWatcher(q)) { w.EventArrived += new EventArrivedEventHandler(TimeEventArrived); w.Start(); Console.ReadLine(); // 阻塞这个线程仅用于测试目的.... w.停止(); } } 静态无效 TimeEventArrived(对象发送者,EventArrivedEventArgs e) { Console.WriteLine("这是你的警钟"); Console.WriteLine("{0}", new DateTime((long)(ulong)e.NewEvent.Properties["TIME_CREATED"].Value)); } }

        【讨论】:

        • 在 TimeEventArrived 方法中,年份似乎偏离了 -1600(我得到 12/28/0409 作为日期,而不是 2009 年 12 月 28 日)。你知道为什么会这样吗?我只需要在一年中增加 1600 吗?
        • 我将用 DateTime.FromFileTimeUtc(...) 替换 new DateTime(...):此方法使用 1601 年 1 月 1 日作为其“0 年”,这是 TIME_CREATED 的正确年份属性
        【解决方案5】:

        检查日期变化的线程怎么样。线程可以有一些需要这些信息的控件可以订阅的事件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-10
          • 2016-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-30
          相关资源
          最近更新 更多