2 NSDates, которые должны быть равны, не так ли? - PullRequest
3 голосов
/ 28 апреля 2011

Я использую библиотеку JSON от Стига Браутасета (http://code.google.com/p/json-framework)), и мне нужно сериализовать NSDate. Я думал о преобразовании его в строку перед JSONification, однако я столкнулся с таким странным поведением:1003 * Почему эти NSDates не считаются равными?

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

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

Ответы [ 3 ]

13 голосов
/ 28 апреля 2011

Когда вы описываете исходный объект даты, вы теряете некоторую точность до секунды от исходного объекта - другими словами, -description сбрасывает доли секунды и возвращает

Строковое представление получателя в международном формате YYYY-MM-DD HH:MM:SS ±HHMM, где ±HHMM представляет смещение часового пояса в часах и минутах от GMT

Когда вы создаете новый объект даты на основе описания, вы получаете его за целые секунды, потому что строка точно с точностью до секунды. Так что -isEqualToDate: возвращает NO, потому что между вашими двумя объектами даты есть доля доли секунды, к которой он чувствителен.

Этот метод обнаруживает разницу в секундах между датами. Если вы хотите сравнить даты с менее точной гранулярностью, используйте timeIntervalSinceDate: для сравнения двух дат.

Таким образом, вместо этого вы сделаете что-то подобное (NSTimeInterval мер в секундах):

if ([d timeIntervalSinceDate:dd] == 0) {
    NSLog(@"Yay!");
}
2 голосов
/ 28 апреля 2011

Поскольку они не эквивалентны:

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: не поддерживает точность до секунды.

2 голосов
/ 28 апреля 2011

isEqualToDate обнаруживает различия в секундах между датами, но метод описания не включает в себя секунды.

...