2011-04-28 3 views
3

Stig Brautaset (http://code.google.com/p/json-framework)의 JSON 라이브러리를 사용 중이므로 NSDate를 직렬화해야합니다. 그러나 JSON 화하기 전에이를 문자열로 변환하는 것을 고려하고 있었지만 이상한 행동을 보았습니다.2 같아야하는 NSDate가 아닌가?

왜 NSDates는 같은 것으로 간주되지 않습니까?

NSDate *d = [[NSDate alloc] init]; 
NSDate *dd = [NSDate dateWithString:[d description]]; 

NSLog(@"%@", d); 
NSLog(@"%@", dd); 
if([d isEqualToDate:dd]){ 
    NSLog(@"Yay!"); 
} 

답변

13

당신은 당신이 원래의 목적에서 일부 초 이하의 정밀도를 잃고 원래의 날짜 개체를 설명 할 때 - 즉, 소수 초 오프 -description 면도를하고, 수신기의

캐릭터 라인 표현을 돌려줍니다 ±HHMM 당신이 새로운 날짜 객체 BAS를 만들 때 GMT

에서 시간과 분으로 시간대 오프셋을 나타내는 국제 형식 YYYY-MM-DD HH:MM:SS ±HHMM에서 디스크립션에 대한 설명은 문자열이 전체 초에만 정확하기 때문에 전체 초 만에 얻을 수 있습니다. 따라서 -isEqualToDate:NO을 반환합니다. 왜냐하면 민감한 두 날짜 개체 사이에 1 초의 차이가 있기 때문입니다.

이 방법은 날짜 간의 초초 차이를 감지합니다. 정밀도가 낮은 정밀도로 날짜를 비교하려면 timeIntervalSinceDate:을 사용하여 두 날짜를 비교하십시오.

그래서 당신은 대신이 같은 (초 NSTimeInterval 조치) 할 것 :

if ([d timeIntervalSinceDate:dd] == 0) { 
    NSLog(@"Yay!"); 
} 
+0

내 두 날짜가 분명히 0.0005 초 떨어져있을 때'-timeIntervalSinceDate :'는 0이 아닌 값을 반환했습니다. 나는 각 날짜에 대해 [NSString stringWithFormat : @ "%. 3f", d]'를 비교해 보았다. – Dov

+0

NSDate.timeIntervalSinceDate는 Double 값인 NSTimeInterval을 반환하며, 두 번째 값은 더 작을 수 있습니다. 이 경우 나는'[d timeIntervalSinceDate : dd] <1 '와 같이 점검 할 것을 제안합니다. 0.1 – Stephan

2

isEqualToDate이 날짜 사이의 subseconds 차이를 감지,하지만 설명 방법은 subseconds 포함되지 않습니다. 그들은 동등하지 않은 때문에

2

는 :

NSDate *d = [NSDate date]; 
NSDate *dd = [NSDate dateWithString:[d description]]; 
NSLog(@"%f", [d timeIntervalSinceReferenceDate]); 
NSLog(@"%f", [dd timeIntervalSinceReferenceDate]); 

는 생산 :

2011-04-28 11:58:11.873 EmptyFoundation[508:903] 325709891.867788 
2011-04-28 11:58:11.874 EmptyFoundation[508:903] 325709891.000000 

즉, +dateWithString: 방법은 초 이하의 정밀도를 유지하지 않습니다.

관련 문제