使用Unity游戏引擎C#在午夜创建重复事件

使用Unity游戏引擎C#在午夜创建重复事件,c#,datetime,unity3d,C#,Datetime,Unity3d,在游戏中,我想每晚午夜触发一个事件。以下代码不起作用: void Update() { var tomorrow = DateTime.Now.AddDays(1).ToShortDateString(); var today = DateTime.Now.ToShortDateString(); if (tomorrow == today) { THE THING I WANT TO HAPPEN AT MIDNIGHT; } } 在

在游戏中,我想每晚午夜触发一个事件。以下代码不起作用:

void Update()
{
    var tomorrow = DateTime.Now.AddDays(1).ToShortDateString();
    var today = DateTime.Now.ToShortDateString();

    if (tomorrow == today)
    {
        THE THING I WANT TO HAPPEN AT MIDNIGHT;
    }
}
在调试过程中,我发现我希望发生的事情运行良好。但是,事件不是从if语句触发的

我在档案中搜索答案,找到了一些,但解决方案不起作用——这几乎可以肯定是一个简单的错误,因为我的编程知识水平极低

任何帮助都会很好…谢谢

如果(明天==今天)
这永远不会是真的。如果正好是午夜(
Jan 01 2000 12:00:00.0000
),那么这一行:
明天=日期时间。现在。AddDays(1)
将等于午夜…明天,所有时间(
Jan 02 2000 12:00:00.0000
)。这同样适用于每隔一个日期和时间

您最好检查一下当前时间是否为午夜,然后将当前日期存储在某个位置,并且仅当当前时间为午夜且存储的日期不是今天的日期时,
DoTheThing()


当然,这也忽略了“如果应用程序不是在午夜主动运行,是否希望事件被追溯触发”的问题。在这种情况下,
TimeSpan
s和
Last\u run\u date
可能会引起兴趣。

您的代码实际上是在询问“
1==1+1
”,答案总是否定的

您需要将上次执行日期存储在方法之外,并且还需要更加小心地进行比较。例如,
DateTime.Now==DateTime.Now
可能返回false(并且经常返回),因为
DateTime
将时间存储到刻度,如果它关闭了一个刻度,就不会被认为是相等的

试试这个:

DateTime lastExecutionDate = DateTime.Utc;

void Update()
{
    var tomorrow = DateTime.Now.AddDays(1).ToShortDateString();
    var now = DateTime.Utc;

    if (lastExecutionDate.Day < now.Day)
    {
        lastExecutionDate = now;

        // this code will be called as close to midnight as unity allows.
    }
}

想想看,明天总是比今天晚一天,因为你一直在改变它。除了这可能是你不想要UTC的极少数情况之一。“Unity”意味着在PC上本地执行exe,这大概是为什么午夜对用户很重要的原因。是的,你是对的。我对它进行了更新以反映这一事实。谢谢你指出这一点。我在服务器上做大部分与时间相关的事情,很久以前我就知道,如果你只使用一次本地时间,你可能会永远使用它。即使这是不正确的。所以我默认为UTC,因为如果需要,您可以随时转换为本地。但在这种情况下,你是绝对正确的。:)谢谢你的发帖!见我上面的帖子。gushier也谢谢你们先生们,正如我所怀疑的,这是一个愚蠢的错误。尽管如此,这个网站(以及所有发布答案的人)还是非常棒,对我来说有很大的不同——它是我唯一学习编程知识的地方。非常感谢一个不太熟悉的新手。
DateTime lastExecutionDate = DateTime.UtcNow + TimeSpan.FromDays(1);