C# 比较C语言中的日期时间# private void ValidateEffectiveDate() { bool-ICAdvanced=SessionManager.DisplayUser.IsInRole(PERMISSIONS.hasICAdvanced); 如果(!ICAdvanced&&model.EffectiveDate

C# 比较C语言中的日期时间# private void ValidateEffectiveDate() { bool-ICAdvanced=SessionManager.DisplayUser.IsInRole(PERMISSIONS.hasICAdvanced); 如果(!ICAdvanced&&model.EffectiveDate,c#,datetime,C#,Datetime,如果你不是先进的,你不应该有一个日期是在过去,一天前今天或更早。然而,你可以在今天或将来拥有 为什么这段代码没有正确地反映这一点?好吧,你要从现在开始,而不是从今天开始。如果“现在”是下午5点,但生效日期是今天午夜,那么当前将添加一个验证错误 所以你可能想要: if(!ICAdvanced&&model.EffectiveDate

如果你不是先进的,你不应该有一个日期是在过去,一天前今天或更早。然而,你可以在今天或将来拥有

为什么这段代码没有正确地反映这一点?

好吧,你要从现在开始,而不是从今天开始。如果“现在”是下午5点,但生效日期是今天午夜,那么当前将添加一个验证错误

所以你可能想要:

if(!ICAdvanced&&model.EffectiveDate

但是,您还需要了解如何表示
model.EffectiveDate
DateTime
处理时区非常不幸,因为值可以是UTC、本地或未指定。我目前不清楚这会如何影响比较(如果我将UTC+5时区中的“本地午夜”与“UTC午夜”进行比较,结果应该是什么)?我认为它将两者视为本地的,因此它会将“本地午夜”和“UTC午夜”比较为相同。但是值得考虑。

我想说的是,问题是你强迫它在当前时刻之后,而不是今天或以后。或许应该是这样的:

if (!ICAdvanced && model.EffectiveDate < DateTime.Today)
private void ValidateEffectiveDate()
{
bool-ICAdvanced=SessionManager.DisplayUser.IsInRole(PERMISSIONS.hasICAdvanced);
如果(!ICAdvanced&&model.EffectiveDate
您对比较不同时区的时间有什么跟进吗?@froeschli:DateTime甚至没有特定时区的概念,除了local/UTC/unspecified。基本上,我认为.NET日期和时间API有些不完善,这就是我开始使用Noda time的原因——但这还没有接近生产准备阶段。谢谢你的回答。我很好奇,因为Robert C.Martin在他的《干净的代码》一书中有一整章是关于比较Java中的日期的。但他也没有提到时区。再次感谢。
if (!ICAdvanced && model.EffectiveDate < DateTime.Today)
private void ValidateEffectiveDate()
{
    bool ICAdvanced = SessionManager.DisplayUser.IsInRole(PERMISSIONS.hasICAdvanced);
    if (!ICAdvanced && model.EffectiveDate < DateTime.Now.Date)
    {
        this.CheckAndAddValidation("EffectiveDate", "You do not have the advanced permission, so you are unable to value historical indications.");
    }
}