【问题标题】:Event for DateChange at midnight [duplicate]午夜 DateChange 的事件 [重复]
【发布时间】:2011-12-13 04:21:54
【问题描述】:

可能重复:
Background Worker Check For When It's Midnight?

是否有我可以注册的 SystemEvent 并将在午夜时发布,当日期更改时?

【问题讨论】:

  • Windows 任务计划程序适合您吗?

标签: c# c#-4.0


【解决方案1】:

这是我用来处理这个问题的一个类。它类似于@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!"); };

【讨论】:

  • 不考虑系统时间的变化,不会在“第一个”午夜之后触发(虽然不清楚提问者是否想要那个)。
  • +1 对,SystemEvents.TimeChanged 是个好方法!
【解决方案2】:

Windows 任务计划程序通常是在指定日期开始某事的正确方法。

但如果你真的在寻找一个事件或等价物:

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

【讨论】:

  • 这不起作用,因为计时器几乎每秒都会引发 Elapsed 事件
  • @sll:怎么样? (DateTime.Today.AddDays(1) – DateTime.Now).Millisecond) 是距离午夜的毫秒数。
  • 不,毫秒将返回一个时间跨度的毫秒值,您需要 TotalMilliseconds 值。你可以检查一下 - 试试看
猜你喜欢
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 2016-01-13
  • 1970-01-01
相关资源
最近更新 更多