【问题标题】:Given a start time and an interval in minutes, determine if current time is an interval给定开始时间和以分钟为单位的间隔,确定当前时间是否为间隔
【发布时间】:2015-06-24 17:58:27
【问题描述】:

我在 VB.NET 中工作,但只是在寻找一个可以为我提供以下信息的公式:

假设我有一个进程需要在开始时间和结束时间之间每 x 分钟启动一次。每分钟我都需要确定是否需要启动该进程。

如果我有以下情况:

StartTime = 8:00:00 AM
EndTime = 11:00:00 PM
IntervalMinutes = 7

我有一个计时器设置为每 1 分钟触发一次。我需要确定当前时间是否是启动进程的时间。

目前我只使用一个循环,将 IntervalMinutes 添加到 StartTime 并将其与当前时间和 EndTime 进行比较。如果 StartTime = CurrentTime 然后启动。如果 StartTime > End Time 则退出循环。我知道它很笨重,但它确实有效。然而,随着时间的推移,它必须迭代更多的分钟。我知道这必须有一个公式,但我的大脑已经因搜索和思考而死。

【问题讨论】:

  • 为什么不使用LastTimeFired 变量
  • 你能不能每间隔分钟而不是每分钟触发一次计时器?
  • 该应用程序用于启动多个进程,每个进程都有不同的开始时间、结束时间和间隔。这是我能想到的最简单的处理方法。
  • 如果您的计时器间隔为一分钟,实际上可能会完全错过“启动”时间。例如,如果您的应用在上午 7:59:59 开始,那么下一个 Tick() 应该在上午 8:00:59 发生......但 Tick() 只能保证在你的间隔之前开火。实际上,它会在该时间间隔过去 之后的某个不确定的时间段内触发。如果您的系统/应用程序很忙,或者由于糟糕的编程您已经停止了线程(可能通过 Sleep 调用),那么 Tick() 可能要到上午 8:01:xx 才会触发,您将错过启动。跨度>
  • 绝对最好通过重复将间隔添加到开始时间来计算您的事件应该发生的初始日期/时间,直到您到达未来的某个时间点。然后查看当前日期/时间是否超过该点以了解您是否需要启动。一旦发生这种情况,您只需将间隔添加到最后一个已知事件日期/时间即可获得下一个事件日期/时间。

标签: c# vb.net datetime intervals


【解决方案1】:

我的伪模运算:

float tolerance = 0.0001f;

if((CurTime - StartTime) % IntervalMinutes <= tolerance)
{
    // Do something
}

【讨论】:

  • 谢谢!这行得通,现在我看到了,这很容易。现在踢自己。
  • 这是我在 VB.NET 中提出的:If ((Now - StartTime).TotalMinutes Mod IntervalMinutes) &lt; 1 Then' Launch ProcessEnd If
【解决方案2】:

您可以在应用启动时预先计算 StartTime 和 EndTime 之间的所有启动时间,将它们放在一个列表中,然后每次计时器触发时,您只需检查当前时间是否 == launchList[0]。如果它启动并从列表中删除该条目。

【讨论】:

    猜你喜欢
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    相关资源
    最近更新 更多