У меня действительно неприятная проблема, которая, кажется, не имеет никакого смысла. Я пытаюсь получить количество лет между двумя датами. Вот мой код.
// Initialize variable to store calendar
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
// Break out date to year component
NSDateComponents *Components = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit
fromDate:startDate
toDate:endDate
options:0];
// Debugging code
NSLog(@"Debug start date = %@",startDate);
NSLog(@"Debug end date = %@", endDate);
NSLog(@"Debug year = %d",[Components year]);
NSLog(@"Debug month = %d",[Components month]);
NSLog(@"Debug day = %d", [Components day]);
NSLog(@"Debug hours = %d",[Components hour]);
NSLog(@"Debug minutes = %d", [Components minute]);
NSLog(@"Debug seconds = %d", [Components second]);
[gregorian release];
// Check which component to extract and return value accordingly
// Defaults to month for now
if ([datecomponent isEqualToString:@"year"]) {
return [Components year];
}
else {
return [Components month];
}
Начальная и конечная даты устанавливаются UIDatePickers в другом месте. По умолчанию они будут на расстоянии 10 лет. Как только я возвращаюсь к UIDatePicker, который контролирует конечную дату, и перемещаю ее на 1 год раньше. Проблема начнет появляться. Это пример NSLog, который я увижу после того, как перенесу дату окончания обратно на исходную дату. Я должен видеть 10 лет и 0 везде, но мне не хватает 1 секунды по времени.
Debug start date = 2011-08-15 15:55:07 +0000
Debug end date = 2021-08-15 15:55:07 +0000
Debug year = 9
Debug month = 11
Debug day = 30
Debug hours = 23
Debug minutes = 59
Debug seconds = 59
Даты начала и окончания выглядят одинаково сохраненными за 10 лет между мной, но по какой-то причине я пропускаю 1 секунду времени. Кто-нибудь знает почему?
Заранее спасибо!
ДОБАВЛЕНО
Вот способ, которым я инициализировал и сохранил 2 даты.
Дата начала указывается в методе viewWillAppear.
- (void)viewWillAppear:(BOOL)animated {
if ([managedObject valueForKeyPath:self.keypath] != nil)
[self.datePicker setDate:[managedObject
valueForKeyPath:keypath] animated:YES];
else
[self.datePicker setDate:[NSDate date] animated:YES];
[self.tableView reloadData];
[super viewWillAppear:animated];
}
Этот же класс также используется для моей даты окончания, однако я также добавил следующий код в свой пользовательский подкласс NSManagedObject: -
- (void)awakeFromInsert {
[super awakeFromInsert];
// Set default date of registration to be today's date
self.startdate = [NSDate date];
NSDate *today = [[NSDate alloc] init]; // I also tried to equate this to self.startdate but there is no difference
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
[offsetComponents setYear:10];
self.enddate = [gregorian dateByAddingComponents:offsetComponents toDate:today options:0];
}
Это вызвало бы какие-либо проблемы? Если да, то почему при отладке даты начала и окончания отображаются с одинаковым временем?