2011-02-23 27 views
0
private void ValidateEffectiveDate() 
{ 
    bool ICAdvanced = SessionManager.DisplayUser.IsInRole(PERMISSIONS.hasICAdvanced); 
    if (!ICAdvanced && model.EffectiveDate < DateTime.Now) 
    { 
     this.CheckAndAddValidation("EffectiveDate", 
      "You do not have the advanced permission, so you " + 
      "are unable to value historical indications."); 
    } 
} 

如果你不ICAdvanced,你不应该能有那就是在过去的某一天,在今天之前或更早一天。但是,您今天或将来都可以拥有。在C#中比较DateTime是否

为什么此代码没有正确反映?

回答

9

嘛,你从现在,而不是今天去的一两件事。如果“现在”是下午5点,但EffectiveDate是今天午夜,那么目前这会添加验证错误。

所以你可能想:

if (!ICAdvanced && model.EffectiveDate < DateTime.Today) 

但是,你还需要制定出model.EffectiveDate是如何表示的。 DateTime非常不幸地处理时区,因为值可能是UTC,本地或未指定。目前我还不清楚这是如何影响比较的(如果我在UTC + 5的时区将“本地午夜”与“UTC午夜”进行比较,结果应如何)?我想认为它把它们当作本地的,所以它会比较“本地午夜”和“UTC午夜”是相同的。值得思考。

+0

你有任何后续比较来自不同时区的时间? – froeschli 2011-02-23 21:26:49

+0

@froeschli:那么DateTime甚至没有特定时区的*概念*,超出本地/ UTC /未指定。基本上,我将.NET日期和时间API视为有些破碎,这就是我开始使用Noda Time的原因 - 但这还不够接近生产。 – 2011-02-23 21:29:29

+0

感谢您的回答。我想知道,因为Robert C. Martin在他的书_Clean_ _Code_中有一整章关于比较Java中的日期。但是AFAIR他也没有提到时区。再次感谢。 – froeschli 2011-02-23 21:34:59

0

我会说,问题在于你迫使它在当前时刻之后,而不是现在或之后。它也许应该是这样的:

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."); 
    } 
}