午夜日期更改的事件

本文关键字:事件 日期 午夜 | 更新日期: 2023-09-27 18:17:31

可能的重复项:
后台工作人员检查午夜时分?

是否有我可以注册的系统事件,并将在日期更改的午夜发布?

午夜日期更改的事件

这是我用来处理这个问题的一个类。这与@sll的答案类似,但考虑到系统时间的变化,并且还会在每个午夜触发,而不是只触发一次。

static class MidnightNotifier
{
    private static readonly Timer timer;
    static MidnightNotifier()
    {
        timer = new Timer(GetSleepTime());
        timer.Elapsed += (s, e) =>
        {
            OnDayChanged();
            timer.Interval = GetSleepTime();
        };
        timer.Start();
        SystemEvents.TimeChanged += OnSystemTimeChanged;
    }
    private static double GetSleepTime()
    {
        var midnightTonight = DateTime.Today.AddDays(1);
        var differenceInMilliseconds = (midnightTonight - DateTime.Now).TotalMilliseconds;
        return differenceInMilliseconds;
    }
    private static void OnDayChanged()
    {
        var handler = DayChanged;
        if (handler != null)
            handler(null, null);
    }
    private static void OnSystemTimeChanged(object sender, EventArgs e)
    {
        timer.Interval = GetSleepTime();
    }
    public static event EventHandler<EventArgs> DayChanged;
}

由于它是一个静态类,因此可以使用如下代码订阅事件:

MidnightNotifier.DayChanged += (s, e) => { Console.WriteLine("It's midnight!"); };

Windows 任务计划程序通常是在指定日期启动某些内容的正确方法。

但是,如果您真的在寻找事件或等效项:

var timer = new System.Timers.Timer((DateTime.Today.AddDays(1) – DateTime.Now).
    TotalMillisecond);
timer.Elapsed += new ElapsedEventHandler(OnMidnight);
timer.Start();