Как не потерять цифры «0» при использовании NSDateComponents. (iphone)

Я использую Date Formatter, получаю NSDateComponents. А затем извлечение отдельных компонентов времени, таких как час, минута и т. д. Как я могу извлечь эти компоненты как NSIntegers, не теряя цифры «0» в начале числа.

Например, сегодня было 1 января 2010 г. 5:05, будет напечатано 1-1-2010-5:5 Я хочу 01-01-2010-05:05

Любая помощь будет оценена


person James    schedule 22.06.2011    source источник
comment
Чего вы хотите достичь? Я имею в виду, почему вы хотите распечатать его, используя компоненты даты, а не средство форматирования даты?   -  person Deepak Danduprolu    schedule 22.06.2011


Ответы (1)


Вы не можете оставить 0 в NSInteger. Таким образом, вы можете выбрать один из подходов здесь —

Избегайте компонентов даты и перепечатывайте дату в другом формате, используя NSDateFormatter

NSCalendar * gregorianCalendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];

NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"MMMM d yyyy H:mm"];
NSDate * theDate = [dateFormatter dateFromString:@"January 1 2010 5:05"];

/* Using NSDateFormatter to get the desired format */
[dateFormatter setDateFormat:@"dd-MM-yyyy HH:mm"];
NSLog(@"%@", [dateFormatter stringFromDate:theDate]);

Из компонентов даты

NSInteger flags = (NSHourCalendarUnit|NSMinuteCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit);
NSDateComponents * dateComponents = [gregorianCalendar components:flags
                                                         fromDate:theDate];

NSInteger hour = [dateComponents hour];
NSInteger minute = [dateComponents minute];
NSInteger year = [dateComponents year];
NSInteger month = [dateComponents month];
NSInteger day = [dateComponents day];

NSLog(@"%02ld-%02ld-%ld %02ld:%02ld", day, month, year, hour, minute);

Использование NSNumberFormatter (расширение предыдущего блока)

NSNumberFormatter * numberFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[numberFormatter setPaddingCharacter:@"0"];
[numberFormatter setMinimumIntegerDigits:2];

NSString * hourString = [numberFormatter stringFromNumber:[NSNumber numberWithInteger:hour]];
NSString * minuteString = [numberFormatter stringFromNumber:[NSNumber numberWithInteger:minute]];
NSString * yearString = [numberFormatter stringFromNumber:[NSNumber numberWithInteger:year]];
NSString * monthString = [numberFormatter stringFromNumber:[NSNumber numberWithInteger:month]];
NSString * dayString = [numberFormatter stringFromNumber:[NSNumber numberWithInteger:day]];

NSLog(@"%@-%@-%@ %@:%@", dayString, monthString, yearString, hourString, minuteString);
person Deepak Danduprolu    schedule 22.06.2011
comment
единственное, это предполагает, что определенные компоненты даты меньше 10, они могут быть любыми значениями. Я надеялся, что будет более элегантное решение - person James; 23.06.2011
comment
Не совсем, предполагается, что компоненты даты состоят из двух цифр. Если встречается однозначное значение, дополните его 0, чтобы печатались две цифры. Есть три разных решения, где третье зависит от второго. - person Deepak Danduprolu; 23.06.2011