2011-02-23 5 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

음, 이 (가) 오늘이 아닌이 될 것입니다. "now"가 오후 5시이지만 오늘 Effectydate가 자정 인 경우 현재 유효성 검사 오류가 추가됩니다.

그래서 당신은 은 수도 것 :

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

그러나, 당신은 또한 model.EffectiveDate가 표시되는 방법을 작동해야합니다. DateTime은 값이 UTC, 지역 또는 지정되지 않은 시간대 일 수 있으므로 시간대 처리가 매우 불행합니다. 나는 그것이 현재 UTC + 5의 시간대에서 "UTC 자정"과 "로컬 자정"을 비교할 경우 비교 결과에 어떤 영향을 미치는지 명확하지 않습니다. 결과는 어떻게됩니까? 나는 라고 생각하면 둘 다 로컬로 처리되므로 "로컬 자정"과 "UTC 자정"을 동일하게 간주합니다. 생각해 볼만한 가치가 있습니다.

+0

다른 시간대의 비교 시간에 대한 후속 조치가 있습니까? – froeschli

+0

@froeschli : 물론 DateTime에는 로컬/UTC/지정되지 않은 특정 표준 시간대의 * 개념 *조차 없습니다. 기본적으로 .NET 날짜 및 시간 API는 다소 손상된 것으로 간주하여 Noda Time을 시작한 것입니다.하지만 아직 생산 준비가되지 않았습니다. –

+0

답해 주셔서 감사합니다. 로버트 C. 마틴이 그의 책 _Clean_ _Code_에서 자바의 날짜를 비교하는 전체 장을 가지고 있기 때문에 궁금합니다. 그러나 AFAIR 그는 시간대도 언급하지 않습니다. 다시 한번 감사드립니다. – froeschli

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