Я пытаюсь сохранить и получить даты в / из JSON.NSDates, созданные из идентичной строки, терпят неудачу isEqualToDate:
.Это, безусловно, связано с проблемой точности с плавающей запятой, но я не знаю, как ее обойти.
Учитывая две одинаковые входные строки для dateFromString:
, в результате NSDate
объекты должны быть равным:
NSDate *date1 = [NSDate date];
NSString *string1 = [dateFormatter stringFromDate:date1];
NSDate *dateA = [dateFormatter dateFromString:string1];
NSDate *dateB = [dateFormatter dateFromString:string1];
XCTAssertTrue([dateA isEqualToDate:dateB]);
... но, на самом деле, получающиеся объекты даты счастливы быть равными (и редко бывают), поскольку из-за проблем точности с плавающей запятой происходит случайное смещение:
(lldb) p [dateA timeIntervalSinceReferenceDate]
(NSTimeInterval) $4 = 560455653.79073596
(lldb) p [dateB timeIntervalSinceReferenceDate]
(NSTimeInterval) $5 = 560455653.79099989
Итак, кто-нибудь сталкивался с этим и обходил его?Единственный вариант, о котором я подумал, - написать свой isEquals:
, но это не идеально.
РЕДАКТИРОВАТЬ:
В частности, я ищу способ преобразованиястроковое представление даты обратно в объект даты, который будет считаться равным для той же самой входной строки.
(Очевидный) факт, что NSDate
сохраняет свое внутреннее состояние в числе с плавающей запятой, не имеет значения в этом фундаментедолжен обеспечить механизм для достижения четности для выходных дат при заданных идентичных входных данных (т. е. одна и та же строка должна давать равные объекты).Либо Фонд предлагает это, и я упускаю это (и надеюсь, что Сообщество знает что-то о Фонде, я не знаю), либо Фонд глючит (в данном случае), и я ищу сообщество Сообщества для обходного пути, которого у меня не было.Это уже не рассматривается.
РЕДАКТИРОВАТЬ 2:
Извинения, мой вопрос, как первоначально задавался, это чепуха.Пытаясь упростить проблему для этого поста, я ввел непреднамеренное сравнение двух чисел, которые не могли быть равны.
Оригинальный бессмысленный пост для потомков:
I'mпытаясь сохранить и получить даты в / из JSON.Сбой NSDate
, который я храню в JSON, isEqualToDate:
объекта NSDate
, который я воссоздаю из сохраненной строки.Это, безусловно, связано с проблемой точности с плавающей точкой, но я не уверен, как обойти это.В частности:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
dateFormatter.locale = [[NSLocale alloc]
initWithLocaleIdentifier:@"en_US_POSIX"];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
NSDate *date1 = [NSDate date];
NSString *string1 = [dateFormatter stringFromDate:date1];
NSDate *date2 = [dateFormatter dateFromString:string1];
NSString *string2 = [dateFormatter stringFromDate:date2];
// This test passes
XCTAssertTrue([string1 isEqualToString:string2]);
// This test fails
XCTAssertTrue([date1 isEqualToDate:date2]);
// This test fails
XCTAssertTrue([date1 isEqual:date2]);
Глядя на date1
и date2
в отладчике, мы видим разницу:
(lldb) p [date1 timeIntervalSinceReferenceDate]
560363055.21521103
(lldb) p [date2 timeIntervalSinceReferenceDate]
560363055.21499991
(обратите внимание на тысячное место)
NSDate
s isEqual:
(и вариант) почти наверняка сравнивает временные смещения экземпляров и, таким образом, терпит неудачу.
Я попытался добавить больше точности к сохраненной строке (то есть .SSSSSS
), но это делаетпохоже, не оказывает влияния.
Итак, кто-нибудь сталкивался с этим и обходил его?Единственный вариант, о котором я подумал - написать свой isEquals:
, но это не идеально.