2009-03-04 2 views
6

두 개의 datetimes가 있습니다. 하나는 타임 스탬프에서, 다른 하나는 코드에서 생성하고 있습니다. 나는 그들의 평등을 시험 할 필요가 있고, 너무 많은 표현없이 그것을하고 싶다. 그들이 경우C#에서 두 DateTime의 동등성을 비교하는 가장 좋은 방법은 무엇입니까?

이 (expireTimeStampUTC.Equals (expectedExpireTime)) {}

내가

상관하지 않는 경우 :

DateTime expireTimeStampUTC = 
    DateTime.Parse(UTCValueFromDatabase)); 
DateTime expectedExpireTime = 
    DateTime.UtcNow.AddHours(NumberOfExpectedHoursInConfig); 

이 테스트의 너무 높은 정밀도는 : 여기 내 두 날짜의 예 두 번째 시간, 정확히 시간. 나는 대부분의 C#을 경험하고 있지 않다

if (expireTimeStampUTC.Date.Equals(expectedExpireTime.Date)) 
{ 
    if (!expireTimeStampUTC.Hour.Equals(expectedExpireTime.Hour)) 
    { 
     pass = false; 
    } 
} 

...이 작업을 수행하는 몇 가지 elegent 방법이 :

아마도 이런 식 화합물을 할 수있는 최선의 해결책이 될 수 있을까?

답변

10

데이터베이스 유형으로 인해 문제가 발생하면 해당 유형으로 변환하여 비교할 수 있습니다. 약 1/3의 DB 저장 시간에 SQLDateTimes로 변환되는 밀리 초를 잃게됩니다.

그렇지 않다면, 당신은 실제로 신경 단위 비교 : 당신은 그들이 시간 시간 범위 내에 있는지 걱정하는 경우

DateTime dt1 = DateTime.UtcNow; 
DateTime dt2 = DateTime.UtcNow.AddMinutes(59); // or 1 or 61 for test values; 

// if the dates are in the same hour (12:10 == 12:50, 1:58 != 2:02) 
if(dt1.Hour == dt2.Hour) // result 

또는

날짜를 뺀 것은 시간 범위를 생성하고 여기에
// if the dates are within one hour of each other (1:58 == 2:02, 3:30 != 4:45) 
if((dt1 - dt2).Duration() < TimeSpan.FromHours(1)) // result 

의 duration은 '절대 값'이며, 우리는 우리가 신경 쓰는 단위 (FromHours)에서 제한을 명시 적으로 만들고 비교합니다.

마지막 줄은 특정 시간 범위 내에서 평등을 수행한다고 생각할 수있는만큼 깨끗합니다.

+0

실제로 이것은 실제로 더 좋은 스타일이라고 생각합니다. 나는 그것이 무엇이 일어나고 있는지 명확하게 생각한다. 이전에 "정답"토큰을 변경 한 적이 없지만,이 경우 더 나은 해결책이라고 생각합니다. – danieltalsky

+0

충분합니다. 내 생각 엔 6 대 1/6 다. "Duration()"구문은 더 읽기 쉽지만 비교할 때 TimeSpan을 새로 작성하는 데 드는 오버 헤드가 (무시할 정도로) 있습니다. –

1

새 DateTime 개체를 만들고 비교합니다. C#에서는 이러한 방식으로 "제거 가능한"객체를 구성하는 데는 거의 페널티가 없습니다.

+0

다시 한 번 코드의 예를보고 싶습니다. – danieltalsky

6

두 시간의 차이를 확인하고 특정 임계 값 (한 시간 동안 3600 초) 이하인지 확인하는 방법은 어떻습니까?

var diff = expireTimeStamp.Subtract(expectedExpireTime).TotalSeconds; 
pass = Math.Abs(diff) < 3600; 
+0

우수 ... 그 대답은 너무 어리석은 명백한 나는 그것을 생각하지 않기 위해 자신을 걷어차 것입니다. 감사. 그리고 코드 샘플도 있습니다. 마법 같은. – danieltalsky

+0

, C#에서는 "var"가 없습니다.) – danieltalsky

+1

* 사용자 C#! Visual Studio 2008으로 업그레이드 할 시간입니다. :) –

4

빼기. 결과가 TimeSpan인지 여부가 특정 최대 범위 내에 있는지 확인하십시오.

+0

DateTime 값은 빼기 연산을 지원합니다. TimeSpan을 얻으면 지정된 간격보다 작은 지 확인합니다. – Cheeso

+1

그건 내가 방금 말한 것이지. – recursive

1

검색된 비즈니스 개체를 커밋 한 단위 테스트를 작성하려고 할 때 문제가 발생했습니다. 내 개체의 "StartTime"속성을 사용하여 개체를 검색하고이 문제가 발생했는지 확인하려고했습니다. 데이터베이스에서 커밋 된 "StartTime"값은 Ticks 값에서 6 자리의 정밀도를 잃었습니다!

내 테스트가 올바르게 수행되고 통과하도록 테스트 조건을 다시 작성하는 방법은 다음과 같습니다. 관련 줄은 두 번째 - 마지막 줄 블록입니다.

DateTime start = DateTime.Now; 
NewEventInfo testEvent1 = FakeEvent("test01action", start); //plus other params for testing 
mServiceClient.AddEvent(testEvent1); 

EventInfo[] eventInfos = null; //code to get back events within time window 

Assert.IsNotEmpty(eventInfos); 
Assert.GreaterOrEqual(eventInfos.Length, 1); 

EventInfo resultEvent1 = eventInfos.FirstOrDefault(e => 
e.Action == "test01action" && 
Math.Abs(e.StartTime.Subtract(testEvent1.StartTime).TotalMilliseconds) < 1000); //checks dates are within 1 sec 
Assert.IsNotNull(resultEvent1); 

나는 EventInfo.StartTime 속성은 1 초 정밀 날짜 시간을 사용하기 때문에 개체가, 단위 테스트 저지른 하나 확신 할 수있는이 방법.

EDIT : 절대 값이 1000과 비교되도록 Math.Abs ​​(DateTime diff)를 추가했습니다.

관련 문제