我有一个方法,它具有DateTime类型的参数,该参数不能在过去,这表示其他一些东西执行时。所以很自然地我想使用这个方法并将DateTime.Now传递给它,以便一切尽快发生。
这里的问题是,调用时的DateTime.Now和实际检查时的DateTime.Now可能是不同的值,所以我如何确保日期不是过去的,允许使用DateTime.Now之类的方法调用该方法?我不想在这里添加幻数,而是一般解决方案。
更新。我发现了这个问题How frequent is DateTime.Now updated
答案 0 :(得分:5)
在我看来,你有两个选择:
添加另一个不占用时间参数的方法(重载),而是立即执行操作,例如
DoAction(attime); - 将在规定时间采取行动
DoAction(); - 将立即采取行动
后者是一个更好的解决方案,但显然可能存在方法可供使用的方式/位置的问题(并假设您无论如何都可以添加方法)。
答案 1 :(得分:4)
如果您希望尽快发生所有事情,为什么不在调用方法时重写您的方法,或者在调用后立即创建一个没有DateTime参数运行的重载。
使用重载当然可以让你在将来的某个时间运行代码(使用DateTime重载)或立即运行。
答案 2 :(得分:3)
这是一个哲学问题 - DateTime.Now总是在过去。
答案 3 :(得分:1)
将条目上的参数与DateTime.Now进行比较。如果它在过去,则使用DateTime.Now。
或者,不要使用参数;只需使用DateTime.Now。
答案 4 :(得分:1)
如果时间足够接近,你必须在测试时有一些容忍度。
答案 5 :(得分:1)
让你的函数采用Nullable<DateTime>
。将空时解释为“立即执行此操作”。
答案 6 :(得分:1)
如果在函数开头检查传递的DateTime参数是否等于或大于DateTime.Now,则在使用DateTime.now调用函数之间系统时间极不可能发生变化。检查时。系统时间每10或15毫秒更新一次,实际的函数调用时间远小于此。
但是,为了确保永远不会发生,你必须检查DateTime.Now.Subtract(new TimeSpan(0, 0, 0, 0, 25))
的通过时间,这样可能会在过去一点点时间被接受。
答案 7 :(得分:0)
如果您的日期arg过去,则抛出ArgumentException?这似乎是最简单的。
答案 8 :(得分:0)
对于参数,请使用返回DateTime
值的委托。调用该函数时,传入一个指向返回DateTime.Now
的函数的委托。