2015-05-15 2 views
0

У меня есть две даты, которые заданы нажатием кнопки. Они хранятся в пользовательском объекте, который наследуется от NSObject.timeIntervalSinceDate сообщает о неправильном значении

Свойства:

@property (nonatomic, strong) NSDate *firstDate; 
@property (nonatomic, strong) NSDate *secondDate; 

Пользовательские методы получения и установки:

- (void)setFirstDate:(float)firstDate { 
    _firstDate = [self dateByOmittingSeconds:firstDate]; 
} 

- (void)setSecondDate:(float)secondDate { 
    _secondDate = [self dateByOmittingSeconds:secondDate]; 
} 

- (NSDate *)firstDate { 
    return [self dateByOmittingSeconds:_firstDate]; 
} 

- (NSDate *)secondDate { 
    return [self dateByOmittingSeconds:_secondDate]; 
} 

Функция, которая удаляет секундной часть NSDate:

-(NSDate *)dateByOmittingSeconds:(NSDate *)date 
{ 
// Setup an NSCalendar 
NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSCalendarIdentifierGregorian]; 

// Setup NSDateComponents 
NSDateComponents *components = [gregorianCalendar components: NSUIntegerMax fromDate: date]; 

// Set the seconds 
[components setSecond:00]; 

return [gregorianCalendar dateFromComponents: components]; 
} 

firstDate is 08:00 и secondDate 13:00, оба установлены сегодня.

Я получаю расстояние между двумя датами и форматировать их, как это:

NSString *myString = [self timeFormatted:[currentModel.secondDate timeIntervalSinceDate:currentModel.firstDate]]; 


- (NSString *)timeFormatted:(int)totalSeconds 
{ 

// int seconds = totalSeconds % 60; 
int minutes = (totalSeconds/60) % 60; 
int hours = totalSeconds/3600; 

return [NSString stringWithFormat:@"%luh %lum", (unsigned long)hours, (unsigned long)minutes]; 
} 

Но он сообщает 4h 59m, 17999,254732 секунд.

Кто-нибудь знает, почему это так?

Спасибо!

ответ

1

Проблема не timeIntervalSinceDate но ваш dateByOmittingSeconds метод, который не правильно укоротить секунды. Причина в том, что second не самый маленький блок в NSDateComponents. Существует также nanosecond и если вы установили, что один в ноль, а

[components setSecond:0]; 
[components setNanosecond:0]; 

тогда он будет работать, как ожидалось.

Немного проще решение использовать rangeOfUnit:

-(NSDate *)dateByOmittingSeconds:(NSDate *)date 
{ 
    NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSCalendarIdentifierGregorian]; 
    NSDate *result; 
    [gregorianCalendar rangeOfUnit:NSCalendarUnitSecond startDate:&result interval:nil forDate:date]; 
    return result; 
} 
+0

я придумал эту идею себе, что, возможно, было меньше блок и пытался найти как setMillisecond или аналогичные, но я не мог найти его. Nanosecond - это единица, которую я искал - отлично работает сейчас, спасибо большое! – Erik

 Смежные вопросы

  • Нет связанных вопросов^_^