2011-02-23 30 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."); 
    } 
}