【问题标题】:C# milliseconds until next day (from now)? [closed]C# 毫秒直到第二天(从现在开始)? [关闭]
【发布时间】:2013-06-28 16:42:09
【问题描述】:

谁能帮我实现一个像一天更改事件(只有 1 个事件,函数)?我只需要这个...

谁能帮我创建一个算法?

  • 我将创建一个 Logger 系统,将所有事件记录在“28-06-2013”​​之类的日志文件中。我需要创建一个事件系统来了解日期变化并创建一个新的日志文件。

  • 我曾尝试制作一个 System.Timers.Timer,但这不是一个好方法。我将创建一个等待(睡眠)直到 x 秒的线程。 (x = 直到第二天的毫秒数)

编辑:我不会检查第一个日期和 DateTime.Now 的函数!因为我可能需要每隔 x 秒调用一次这个方法,但我需要一个像“Thread.Sleep(x);”这样的答案执行!即性能对我来说很重要(我将在网络项目中使用此实现)

【问题讨论】:

  • 记下当前日期,然后启动计时器,并比较日期直到发生变化。
  • 您的问题应该是关于您遇到的特定问题,而不是您希望其他人为您实施的一般要求。你试过什么?您是否考虑过制定计划任务而不是让程序 24/7 运行?
  • -3 huh? I need help, please be more tolerant! 就像最接近的原因所说:“问题必须表明对正在解决的问题有一个最低限度的了解。告诉我们你尝试过什么,为什么它没有'不工作,它应该如何工作。另请参阅:堆栈溢出问题清单。这是一个“请给我代码”的问题,没有表现出任何努力。
  • 您在 Windows 应用程序或 Web 上工作什么???你甚至没有写你尝试过的东西!!!
  • 任何基于计算从现在到下一次日期更改的时间的技术在遇到意外的时间更改(例如夏令时和 NTP 更新)时注定会失败。

标签: c# events datetime time


【解决方案1】:

你可以使用:

DateTime now = DateTime.Now;
DateTime tomorrow = now.AddDays(1).Date;

double durationUntilTomorrow = (tomorrow - now).TotalMilliseconds;

我将创建一个 Logger 系统,将所有事件记录在一个日志文件中,例如“28-06-2013”​​。我需要创建一个事件系统来了解日期变化并创建一个新的日志文件。

鉴于您的目标是将其放入记录器中,因此仅在您的记录方法中处理它会更简洁。如果您跟踪上次写入时间,您可以在新日期调用日志记录方法后立即增加日志。

使用这种方法的唯一缺点是,如果某天根本没有日志事件发生 - 在这种情况下,您不会为那一天创建一个空日志文件(这可能很好,但可能不是,具体取决于根据您的需要)。

【讨论】:

  • 但这不起作用。如果时间意外更改(夏令时、NTP 更新、用户更改时钟),那将会失败。
  • @JimMischel 是的,你是对的,但我会在作为我的网络服务器的 VPS 中运行这个程序,然后没人会改变它。此外,我将添加一个日志文件名检查器,用于检查旧文件名和新文件名。如果它们相同,我会重新调用这个函数:)(也许我可以解决你的问题)
  • @MehmetFatihMarabaoğlu:甚至服务器也会获得 NTP 更新。并且,根据服务器的不同,可能会受到夏令时更新的影响。这两个都是自动的。而且,是的,你也许能够“解决”这个问题,但你仍然让它变得比它需要的复杂得多。为什么在不需要时使用线程或计时器?
  • @JimMischel 是的,你是对的。
【解决方案2】:

最简单的方法是在每次编写日志消息时保存日期。然后,当您要编写日志消息时,只需将当前日期与前一个日期进行比较。如果它们不匹配,请启动一个新的日志文件。不需要线程或任何东西。 . .

private _lastWriteDate = DateTime.MinValue;

public void LogIt(string message)
{
    var nowDate = DateTime.Now.Date;
    if (nowDate != _lastWriteDate)
    {
        // close current log and open a new one
    }
    WriteLog(message);
    _lastWriteDate = nowDate;
}

简单、有效。

【讨论】:

  • 但我认为这段代码在 2 天后将无法正常工作。我说的对吗?
  • 不,这段代码应该可以无限期地工作。为什么你会认为它会在两天后停止工作?
  • 因为 DateTime.MinValue?
  • DateTime.MinValue 只是一个初始值。如果你愿意,你可以把它设为DateTime.Now.Date
【解决方案3】:
 DateTime now = DateTime.Now;
 DateTime tomorrow = now.AddDays(1);
 TimeSpan duration = tomorrow.Date - now;

【讨论】:

  • 这将始终给出一个负数,因为在这种情况下“明天”将始终为 0。 (您的“明天”计算与TimeSpan tomorrow = new TimeSpan(0,0,0); 相同)
  • 嗯,不行。它给出了“-700000000”之类的输出。
  • 如果您想要完成的是在第二天发生的事件上滚动日志,那么您可能会更好地保持当前日期和下一个事件的时间发生检查 datetime.now 以查看日期是否已更改,如果已更改,则启动新的日志文件。不需要计时器。
  • sry 我没有测试代码。呃...更新了
  • 我认为这一切都没有抓住重点。 OP 说他的目标是在每日日志中记录事件。当您可以从事件发生时的当前日期创建日志的文件名并将事件写入该文件时,计时器或睡眠是一种浪费。无需知道现在几点。
【解决方案4】:

创建一个线程或计时器来检查类似的东西:

private DateTime today;
private void IsNextDay()
{
    if (DateTime.Now.Substract(today.Date.AddDays(1)).TotalMilliseconds <= 0)
    {
        today = DateTime.Now; //Next Date so you can check every day

        //FireCustom-Event or do your work here
    }
}

编辑: 根据您的编辑。您是否必须保持文件打开/或 Db 连接或类似的东西?如果不是,您可以使用实际日期编写每个日志条目。我的意思是这样的:

using (StreamWriter w = File.AppendText(#FileNameWithDateGoesHere#))

【讨论】:

  • 我认为计时器是更好的选择...
  • 我认为这不是一个好方法,因为我必须每隔 x 秒调用一次这个函数。必须有 1 个函数才能像“Thread.Sleep(x);”一样执行此操作。
猜你喜欢
  • 2015-01-29
  • 2012-09-22
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多