Локализованная дата (месяц и день) и время с помощью NSDate

Я хочу иметь возможность получать локальную дату и время, где бы ни запускалось мое приложение, на основе конфигурации iPhone. В частности, мне нужно, чтобы дата имела формат мм/дд или дд/мм (или дд.мм, мм.дд, дд-мм, мм-дд и т. д.) в зависимости от локали, а время — чч:мм. Возможно ли это с помощью некоторой комбинации методов SDK?

Спасибо!


person DNewell    schedule 03.03.2011    source источник


Ответы (2)


Я изменил код так, что он просто берет дату и время из объекта NSDate без изменений:

NSDate* date = [NSDate date];
NSString* datePart = [NSDateFormatter localizedStringFromDate: date 
                                                    dateStyle: NSDateFormatterShortStyle 
                                                    timeStyle: NSDateFormatterNoStyle];
NSString* timePart = [NSDateFormatter localizedStringFromDate: date 
                                                    dateStyle: NSDateFormatterNoStyle 
                                                    timeStyle: NSDateFormatterShortStyle];
NSLog(@"Month Day: %@", datePart);
NSLog(@"Hours Min: %@", timePart);
person Daniel T.    schedule 04.03.2011
comment
Это прекрасно работает. Однако, если в локализованной дате сначала стоит год, то этот код ломается, не так ли? - person DNewell; 04.03.2011
comment
Истинный. Есть ли такая локализация? Проблема в том, что у нас нет надежного способа определить, какое число является годом из строки. Лучше всего было бы не пытаться изменить то, что выходит из DateFormatter... Я изменил код в своем ответе, чтобы сделать именно это. - person Daniel T.; 05.03.2011
comment
Если вы посмотрите на мой код, то увидите, что строка, которая получает формат даты, является секретом. Это дает мне локализованный формат: г/мм/д, д/мм/г, мм/д/г или любой другой. Как только я удалю y и разделитель, я могу использовать эту строку в качестве аргумента setDateFormat для средства форматирования и получить соответствующую локализованную дату без года. - person DNewell; 05.03.2011

Ну, я считаю, что следующий код работает для того, что мне нужно:

NSString *dateComponents = @"yMMd";
NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:dateComponents options:0 locale:[NSLocale currentLocale]];
NSArray *tmpSubstrings = [dateFormat componentsSeparatedByString:@"y"];
NSString *tmpStr;
NSRange r;
if ([[tmpSubstrings objectAtIndex:0] length] == 0) {
    r.location = 1;
    r.length = [[tmpSubstrings objectAtIndex:1] length] - 1;
    tmpStr = [[tmpSubstrings objectAtIndex:1] substringWithRange:r];
} else {
    r.location = 0;
    r.length = [[tmpSubstrings objectAtIndex:0] length] - 1;
    tmpStr = [[tmpSubstrings objectAtIndex:0] substringWithRange:r];
}
NSString *newStr = [[NSString alloc] initWithFormat:@"%@ H:mm", tmpStr];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:newStr];
NSString *formattedDateString = [formatter stringFromDate:[NSDate date]];
person DNewell    schedule 04.03.2011